The brand system
Everything a contractor, a sponsor’s designer or the next agent session needs to build a surface that is indistinguishable from the live site. Every swatch, ratio and specimen below is generated from brand/tokens.css at build time. Nothing on this page is transcribed, because the document this replaces went stale the day the mark changed.
What is deliberately still open
This page is written in the register of SPUR-PROVENANCE.md, which records that the founder chose against the panel’s own first pick and that the display-serif-G distinctiveness charge “survives every fix”. That honesty is the best thing in the brand documentation and it is carried here rather than smoothed away.
The naming hierarchy
The section that did not exist anywhere in the repo, and the root of half the incoherence. Everything below refers to it. The brand shipped six simultaneous wordmark treatments across the masthead, the footer, three kit files, the email and the OG card, none sharing a form, a family, a weight, a colour model or even a name string. This table is the ruling.
| Role | The string | Set in | Where it is legal |
|---|---|---|---|
| House brand | Gainesville Florida | n/a | the entity, in prose and legal text |
| Wordmark | gainesvilleflorida.com | Spline Sans Mono 700 | the masthead, with the Spur plate |
| Display statement | Gainesville / Florida | Fraunces 900 | the footer nameplate and the OG card, nowhere else |
| Flagship product | This Weekend in Gainesville | Fraunces | the home hero, the calendar, the digest subject |
| Second vertical | Things to Do | Fraunces | the attractions hub and its pages |
| Newsletter | The Friday Email | Fraunces | one name. "The Gainesville Weekend" is retired |
The mark
Spur, an editorial G (D-074). The path data below is read out of brand/kit/logo-mark.svg and brand/kit/logo-mark-micro.svg at build time, so this page cannot show a mark production does not use. Copy the master; never redraw it.
Two cuts, at matched cap height
Rendered, not described
Colour law
The struck criterion
“Choose a face that rhymes with the mark” is removed from all future selection criteria, permanently. The frozen Spur was rendered beside seven serif capital Gs and five grotesques at matched cap height: every serif has a top beak and a spur descending below the crossbar, and the Spur has neither by an explicit decision recorded twice in its own provenance. All five grotesques share its construction exactly. Derivable from the frozen path itself (outer radius 41, inner ellipse 23.5 by 32.5 at -10 degrees): the Spur is a modulated grotesque G. Its construction is sans; only its modulation is serif. No text serif on the market will rhyme with it, so the charge cannot be answered by choosing a typeface.
Misuse
Lockups
The masthead lockup is canonical. This is the section that closes the founder's flagged open question.
| Ruling | Why |
|---|---|
| The wordmark stays Spline Sans Mono 700 at 13-14px. | Fraunces is rejected at that size for two reasons verified in the shipped binary. Its stroke contrast RISES as weight falls, so the 500-600 recommendation is the worst available setting. And Fraunces ships liga, so the default fl ligature fires exactly across the “gainesville | florida” word seam, binding the two words a reader needs to see as two. |
| The mark becomes a plate. | Reversed limestone Spur in a 22-24px aquifer-deep tile at radius 2px. It closes four measured problems: the value inversion (a mark at 8.98:1 receding behind a wordmark at 14.74:1 bold), the 20:1 ink-area loss to the PROMOTE CTA in the same 62px row, the “G gainesvilleflorida.com” capital-G-into-lowercase-g stutter, and the fact that the reversed colour rule is specified in three documents and ships on zero live surfaces. Wave 3 builds it. |
| The footer mega wordmark is the display statement, not a second wordmark. | Masthead = instrument panel. Footer = nameplate. Both are on this page: scroll up for the masthead and down for the nameplate. That is a system rather than a contradiction, and it stops being one the moment it is written down. |
| The .com is never tinted. | The spec forbids it and production does not do it. Three kit lockups tint it; the kit is wrong. SPUR-PROVENANCE’s open question 1 asserts production tints it, which is factually incorrect, so that question rests on a false premise and is closed on the evidence. |
Type
Fraunces and Spline Sans Mono. Both stay. What changed is how they are driven: the role rule, the optical-size policy, a ten-step scale replacing a 34-value continuum, and a lint that makes the scale true.
Spline Sans Mono sets what the reader does not read as a sentence. Fraunces sets everything else.
The scale
Optical size, and the one line that must never come back
Default policy: opsz always equals the rendered size. Fraunces ships an rvrn FeatureVariations rule that swaps the wonky h m n s and the swash Et ampersand for plain forms and a conventional ampersand below its own threshold. The site pinned font-variation-settings: "opsz" 26 on body, which per CSS Fonts 4 beats the font-optical-sizing: auto declared immediately above it, so every surface sat above the threshold and the site downloaded a fix it then cancelled. The specimen below is the whole argument, and it is why the pin must not be restored by anyone fixing a symptom.
| Exception | Setting | The written reason |
|---|---|---|
| display and mega | opsz interpolates with the clamp | A 52px mobile hero pinned at opsz 144 is drawn with hairlines for a size twice as large, which is why the mobile H1 reads thinner and more fragile than the desktop one at the same weight. Desktop keeps its engraved look; mobile stops being fragile. |
| list row titles | render 22px, set opsz 18 | 18 is below Fraunces’ own threshold, so the row gets the plain forms and the conventional ampersand. The list is scanned, not read, and the swash Et costs a beat on every row containing one. |
| anchor row titles | render 28px, opsz 28 | Above the threshold, so anchors keep the wonky forms and the swash Et. The ordinal tier is a genuinely different drawing rather than a heavier weight, at zero byte cost. |
| the domain string | font-variant-ligatures: none | Fraunces ships liga and the default fl ligature fires across the “gainesville / florida” word seam. |
Weight, leading, tracking
The fallback stacks
This is the subsection that would have caught the OG bug in four seconds. Two of the brand’s surfaces load no webfont at all, and their substitutions are invisible until somebody looks.
| Surface | Display voice | Readout voice | The rule |
|---|---|---|---|
| The Friday Email | Georgia, "Times New Roman", serif | ui-monospace, SFMono-Regular, Menlo, Consolas, monospace | No email client loads a webfont worth relying on, so this stack IS the email’s type system. It is why a second serif was rejected: with two, BOTH collapse to Georgia and the perform/read distinction disappears on the highest-intent surface the business owns. |
| The OG card (Satori) | Fraunces 900 at opsz 144, Fraunces 400 at opsz 30 | Spline Sans Mono 500 | Each face is registered with ImageResponse and pinned to the instance it is drawn at. Generic serif and monospace families are FORBIDDEN there: Satori resolves only registered families, so a generic name silently falls through. That is exactly how the card lost its mono voice on every share and every AI-answer citation without anyone noticing. |
The payload budget
| Face | Bytes | Preloaded | Note |
|---|---|---|---|
| Fraunces variable, roman, opsz 9-144 | 67,388 | yes | 245 glyphs. fvar = [opsz 9/9/144, wght 100/900/900]. GSUB = [liga, rvrn]. |
| Spline Sans Mono variable | 36,528 | yes | wght 300-700. Monospaced, so its figures are tabular by construction. |
| Fraunces italic | 81,704 | NO, dropped | It was preloaded on every route to set the word “in” in the home hero, its only call site in the app: 44% of the preloaded type budget for two letters on one page. Preloaded bytes 185,620 to 103,916. |
Colour
Zero new hues. Every ratio below is computed at build time from the hexes in the token file against the six grounds, so a hex change moves the number.
Colour encodes decisions, not taxonomy. Category is carried by typography.
Colour used to answer “what bucket is this row in”. Nobody chooses a Saturday night by bucket. Readers choose on: does it cost money, is it happening now, is this the good one, can I trust this listing. Those four rendered in zero colour while ten taxonomy buckets consumed the entire chromatic budget.
Every pigment, against every ground
| Token | Value | ground | gr-deep | gr-sink | flood | fl-deep | plate | Job |
|---|---|---|---|---|---|---|---|---|
| ground | #F4EFE6 | 1.00 | 1.11 | 1.26 | 8.98 | 12.72 | 14.74 | Limestone. Primary page ground. |
| ground-deep | #EAE3D5 | 1.11 | 1.00 | 1.13 | 8.06 | 11.41 | 13.22 | Limestone Deep. Panels, the coordinate strip. |
| ground-sink | #DED6C4 | 1.26 | 1.13 | 1.00 | 7.11 | 10.07 | 11.68 | Limestone Sink. Inset wells, table zebra. RULE: links on sink are aquifer-deep (7.11:1). Plain aquifer is 4.36:1 here and FAILS AA. |
| ink | #1A1E19 | 14.74 | 13.22 | 11.68 | 1.64 | 1.16 | 1.00 | Cypress Ink. All display + body text. 14.74:1 on ground. Also the CANCELLED label and the PROMOTED text on ochre. |
| ink-muted | #3A3F36 | 9.43 | 8.46 | 7.47 | 1.05 | 1.35 | 1.56 | Secondary text. 9.43:1 on ground. |
| ink-soft | #4B5147 | 7.14 | 6.41 | 5.66 | 1.26 | 1.78 | 2.06 | Meta text, the unboxed category label, a real price. 7.14:1. |
| ink-faint | #545B4E | 6.15 | 5.51 | 4.87 | 1.46 | 2.07 | 2.40 | Text floor; the STALE dot; unknown admission. 6.15:1 on ground. |
| aquifer | #0C6B6B | 5.50 | 4.94 | 4.36 | 1.63 | 2.31 | 2.68 | Links, venue names, eyebrows, small UI. 5.50:1 on ground. FAILS AA on ground-sink (4.36:1), use aquifer-deep there. |
| aquifer-deep | #08484C | 8.98 | 8.06 | 7.11 | 1.00 | 1.42 | 1.64 | CTA fills, the footer flood, the ON NOW reversed chip, the Spur plate. Ground text on it 8.98:1. |
| spring | #2AA3A0 | 2.68 | 2.40 | 2.12 | 3.35 | 4.75 | 5.50 | RESTRICTEDRESTRICTED TO DARK SURFACES. Flood flow lines only. LEDGER CORRECTION 2026-08-12: this file stated 3.60:1 on ground in two places and framed that as clearing the 3:1 graphic floor. The true value is 2.68:1 and it clears NOTHING on limestone. On the flood it is 3.35:1 and legal as a graphic. See the ledger at the foot of this file. |
| shallow | #7FCFC4 | 1.58 | 1.41 | 1.25 | 5.69 | 8.06 | 9.35 | RESTRICTEDRESTRICTED TO DARK SURFACES. Footer wordmark, far rings, chip counts on the flood. 1.58:1 on ground, invisible. |
| palmetto | #5F6B34 | 5.04 | 4.52 | 3.99 | 1.78 | 2.52 | 2.93 | SINGLE JOB: the plot's FREE open-ring stroke, 1.2px. 5.04:1 on ground, clears the 3:1 graphic floor. |
| palmetto-deep | #4A5528 | 7.00 | 6.27 | 5.54 | 1.28 | 1.82 | 2.11 | SINGLE JOB: the word "Free" in the meta line, weight 600. 7.00:1 on ground. Free is olive in both registers. |
| ochre | #C8862F | 2.65 | 2.38 | 2.10 | 3.38 | 4.79 | 5.55 | RESTRICTEDFILL AND GRAPHIC ONLY, never text, at any size, in any context (2.65:1 on ground). Exactly two jobs: the liveness dot, and the PROMOTED chip fill / paid-zone gutter rule. |
| ochre-deep | #A86A1E | 3.86 | 3.47 | 3.06 | 2.32 | 3.29 | 3.82 | RESTRICTEDEDGE, not text. Legal on ground (3.86:1) and ground-deep (3.47:1) only. On sink it is 3.06:1 and on the flood 2.32:1, so promoted chips there take ink-muted or flood-text instead. This asymmetry is written down rather than rediscovered. |
| flood-text | #CFE6E2 | 1.14 | 1.02 | 1.11 | 7.87 | 11.15 | 12.92 | Body text on all three dark surfaces. 7.87:1 on flood. |
| flood-deep | #052E31 | 12.72 | 11.41 | 10.07 | 1.42 | 1.00 | 1.16 | NEW. The second altitude inside the dark band: it sits 1.42:1 from the flood, so the dark region gets internal structure instead of being one flat slab. Carries flood-text 11.15, ground 12.72, shallow 8.06, ochre 4.79. |
| plate | #1A1E19 | 14.74 | 13.22 | 11.68 | 1.64 | 1.16 | 1.00 | NEW (alias, zero pigment). Names ink's legality as a full-bleed editorial ground. Every existing token works on it: ground 14.74, flood-text 12.92, shallow 9.35. |
| wash-aquifer | rgba(12,107,107,.05)composites #E8E8E0 | 1.08 | 1.07 | 1.06 | 1.03 | 1.04 | 1.04 | NEW. Tokenizes the row-hover wash that ships today as an undocumented rgba(12,107,107,.04) literal in five files. Nudged .04 -> .05 so it stays perceptible on ground-deep. MUST be gated behind @media (hover: hover). |
| admin-alert | #9A3412 | 6.38 | 5.72 | 5.05 | 1.41 | 1.99 | 2.31 | RESTRICTEDNEW. Promotes globals.css's undeclared --color-destructive into the audited file: it ships in seven /admin files and was audited nowhere. 6.38:1 on ground. RULE: NEVER on a public route. Its hue (~19) sits next to ochre (~33) and D-008 excludes Gator orange, so the containment rule is load-bearing, not housekeeping. |
| hair | rgba(26,30,25,.16)composites #D1CEC5 | 1.37 | 1.37 | 1.35 | 1.10 | 1.03 | 1.00 | Standard divider. Composites #D1CEC5, 1.37:1 vs ground. |
| hair-strong | rgba(26,30,25,.32)composites #AEACA4 | 1.99 | 1.95 | 1.92 | 1.19 | 1.06 | 1.00 | Emphasized rule; the cancelled strike; the filled form-field left border. Composites #AEACA4, 1.99:1. |
| hair-teal | rgba(12,107,107,.28)composites #B3CAC4 | 1.51 | 1.49 | 1.45 | 1.15 | 1.25 | 1.26 | Aquifer divider. |
| hair-flood | rgba(244,239,230,.24)composites #F4EFE6 | 1.00 | 1.03 | 1.06 | 1.85 | 2.00 | 2.07 | Rule on aquifer-deep (composites #417071, 1.85:1); also legal on flood-deep and the plate. |
| tint-aquifer | rgba(12,107,107,.14)composites #D4DDD5 | 1.21 | 1.21 | 1.20 | 1.07 | 1.12 | 1.11 | RETIRING IN WAVE 2. Category colour is retired by D-077; these two tints still have live call sites (badge.tsx, chip grounds), so they are held here until wave 2 removes the components that read them. Their measured ratios are the autopsy, printed on /brand so nobody re-proposes them: tint-aquifer composites #D4DDD5 = 1.21:1 vs ground, tint-ochre composites #EBDAC1 = 1.20:1 and carries the 3.23:1 FREE text. Do not add a call site: `pnpm lint:tokens` is where that gets caught. |
| tint-ochre | rgba(200,134,47,.20)composites #EBDAC1 | 1.20 | 1.18 | 1.15 | 1.21 | 1.31 | 1.36 | RETIRING IN WAVE 2. Category colour is retired by D-077; these two tints still have live call sites (badge.tsx, chip grounds), so they are held here until wave 2 removes the components that read them. Their measured ratios are the autopsy, printed on /brand so nobody re-proposes them: tint-aquifer composites #D4DDD5 = 1.21:1 vs ground, tint-ochre composites #EBDAC1 = 1.20:1 and carries the 3.23:1 FREE text. Do not add a call site: `pnpm lint:tokens` is where that gets caught. |
The token file published --color-spring at 3.60:1 on limestone in two places and framed that as clearing the 3:1 graphic floor. The true value is 2.68:1 and it clears nothing. Every other ratio in the file verified exact. The number in this sentence is computed, not typed. Recording the error rather than quietly fixing it is how a ledger keeps its authority, and pnpm lint:tokens now recomputes every published row and fails the build on any that is wrong.
The semantic layer
| Semantic token | Resolves to | Hex | On ground | The form that actually carries it |
|---|---|---|---|---|
| --signal-free-text | palmetto-deep | #4A5528 | 7.00:1 | the word "Free", weight 600, last meta segment. NO BOX. 7.00:1 |
| --signal-free-graphic | palmetto | #5F6B34 | 5.04:1 | the plot's open ring, 1.2px stroke, ground fill. 5.04:1 |
| --signal-priced | ink-soft | #4B5147 | 7.14:1 | a real price ("$19"), weight 400, same slot. 7.14:1 |
| --signal-price-unknown | ink-faint | #545B4E | 6.15:1 | "See source for pricing", weight 400. 6.15:1 |
| --signal-promoted-fill | ochre | #C8862F | 2.65:1 | SOLID BOX. The only light fill in a row. |
| --signal-promoted-text | ink | #1A1E19 | 14.74:1 | text inside that fill. 5.55:1, clears AA at any size. |
| --signal-promoted-edge | ochre-deep | #A86A1E | 3.86:1 | 1px edge. Ground and ground-deep ONLY (see the asymmetry note). |
| --signal-promoted-rule | ochre | #C8862F | 2.65:1 | 2px left-gutter rule bleeding 12px past the row edge. |
| --signal-live-fill | aquifer-deep | #08484C | 8.98:1 | REVERSED SOLID BOX. The only dark fill in a row. |
| --signal-live-text | ground | #F4EFE6 | 1.00:1 | text inside that fill. 8.98:1 |
| --signal-cancelled | ink | #1A1E19 | 14.74:1 | mono uppercase 10px, FIRST meta segment, plus a 1.4px hair-strong strike. NO HUE. 14.74:1 |
| --signal-fresh | ochre | #C8862F | 2.65:1 | 8px dot + 1px ochre-deep ring + 2.6s pulse. The RING is what clears the 3:1 floor: today's rgba(200,134,47,.22) halo composites to #EAD8BE at 1.22:1 and rescues nothing. |
| --signal-stale | ink-faint | #545B4E | 6.15:1 | the SAME 8px dot, no ring, NO PULSE. Past 36h since the last successful sync. A freshness system that cannot express staleness is a decoration containing a date. |
Form carries, colour confirms
The graveyard
The colour-budget rule
No single chromatic band may exceed 25% of a page’s rendered height. The event page is at 45.8% today and /submit at 40.3%, which is a colour rule with a layout consequence, and it is the mechanism that stops the brand’s balance inverting on the citation-earning template. Checkable, and currently failing on two routes.
The Boil
Its job, narrowed to something teachable.
The Boil is the dataset’s own shape. Rings and dots when it carries data, flow lines when it carries the flood. It is never an icon and never a texture on the limestone ground.
| Surface | Fate |
|---|---|
| The hero plot: rings and dots, real weekend data | KEEP and promote. The only visual asset a competitor cannot copy without the dataset. |
| The footer flood: flow lines | KEEP. Mask fixed. |
| 404 / error / confirmation, at 72-80px | KEEP. The largest object on the page with no competing mark. |
| Category, things-to-do, series, venue, about and promote hero art | RETIRE (wave 5). Arcs at ~10% opacity with a filled pale disc that reads as a half-loaded image. |
| The 22px event-page breadcrumb Boil | RETIRE (wave 5). It sits forty pixels from a 16px Spur, in a different teal. |
| The 34px ochre Boil on the promoted card | RETIRE (wave 2). Never ochre. |
| The digest masthead | ADD (wave 5). A weekly static PNG of that week's plot: the one image in an inbox nobody else can produce. |
Forbidden
Furniture
The section that makes an off-brand page impossible. A new page that copies the coordinate strip correctly looks on-brand even with the mark removed; one that gets it wrong does not, whatever logo it uses.
The stale state, beside the fresh one
Hairlines, radius, the eyebrow
Motion
A namespace that did not exist. Starting position: no system and no crimes.
Motion reports. It does not perform.
| Token | Value | Job |
|---|---|---|
| --motion-instant | 90ms | colour and border swaps on hover and focus |
| --motion-state | 160ms | pressed, chip on/off, filled-field border, count fade |
| --motion-shape | 240ms | expand/collapse height, the recurring-program details |
| --motion-arrive | 420ms | the added-since gutter rule, once per session |
| --motion-stagger | 40ms | delay between staggered arrival marks. HARD CAP of 6 |
| --ease-standard | cubic-bezier(0.32, 0, 0.24, 1) | everything except arrival |
| --ease-settle | cubic-bezier(0.16, 0.84, 0.28, 1) | arrival only. Decelerating |
| --pulse-period | 2.6s |
+ THE CONTINUITY DEMO · expand this disclosure
Never animates
Voice
Plain declarative. Specifics over adjectives. No hype.
- No em-dashes in rendered copy. Code comments may use them.
- Invent nothing. Every event and attraction fact traces to a fetched URL in sources.md. Blocked sources are documented honestly, never faked.
- Founder facts are an allowlist: name, founder role, domain ownership, UF-alumnus status, reason for building, LinkedIn URL. Nothing else. No invented testimonials, stats or endorsements.
- Never assert a cadence the system is not currently meeting, and every freshness claim must have a designed failure state.
- Honesty on derived facts. first_seen means “the first ingest run that produced this row”, not “newly announced”, so the copy says “added to this calendar” and never “new event”. The default cadence string is “NOT LISTED AGAIN”, which is a claim about the dataset and cannot be wrong; “ONCE A YEAR” is legal only when the series registry supplies the edition fact.
Worked pairs, from real defects
| Shipped | Correct |
|---|---|
| FOUND VIA ALACHUA-LIBRARY | Listed from Alachua County Library District, read August 12, 2026. Confirm details with the venue or organizer. |
| LAST SYNC 2026-07-09 | SYNCED 34 DAYS AGO · 2026-07-09 02:33 EDT · CHECKING |
| FIELD GUIDE No. 01, on a weekly | Nothing. A frozen issue number on a weekly is a freshness claim the system is not meeting. |
The surface gallery
Putting the OG card next to the site header on one screen would have exposed the missing mono voice in about four seconds. That is the whole argument for this section.
Two of the surfaces are already on this screen and are the real components, not pictures of them: the masthead at the top of this page, and the footer nameplate below it. The rest are files, listed with where they live so a contractor can open them.
| Surface | Where it lives | Polarity |
|---|---|---|
| Favicon | site/app/icon.svg | dark on limestone |
| Apple touch icon | site/app/apple-icon.png | dark on limestone |
| App tile | brand/kit/app-tile.svg | dark on limestone |
| Manifest theme colour | site/app/manifest.ts | #F4EFE6 |
| OG card | site/lib/og.tsx | dark on limestone |
| Social avatar | brand/kit/social-avatar.svg | REVERSED, the single sanctioned alternate |
| Digest masthead | site/emails/components/layout.tsx | dark on limestone |
Provenance
Where every ruling on this page comes from, and what it supersedes.
| Document | What it is |
|---|---|
| plan/v4/brand-system.md | The governing document for this system: decisions, the token set, the protect list, this page's spec, the five implementation waves and the honest risks. |
| plan/v4/audit-evidence.md | The measured evidence base: font binaries, contrast ledger, call-site censuses, page heights. |
| decisions.md D-008 | The SPRINGS art direction. Unchanged by this system: not one new hue is introduced anywhere. |
| decisions.md D-074 | The Spur, a founder-directed amendment to the brand freeze. Mark only. |
| decisions.md D-076 to D-079 | This system: type, colour allocation, payload and the off-site surfaces, the Boil and the footer. |
| brand/kit/spur-lockup-spec.md | The mark's frozen geometry and the lockup rules. |
| brand/kit/SPUR-PROVENANCE.md | How the mark was chosen, including what was rejected and why. Read it before proposing a change to the mark. |
| brand/guidelines.html | SUPERSEDED by this page. It is a 61KB snapshot that still shows the retired mark and contradicts production. Kept for archaeology only. |