Alachua County, FLSynced 3 hours ago
Brand system · Internal reference · Not indexed

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.

Version
Brand system v2 · wave 1 of 5 · generated 2026-08-13 10:39 UTC
Governing decisions
D-008 the SPRINGS direction · D-074 the Spur · D-075 enforcement and this page · D-076 type · D-077 colour · D-078 payload and the off-site surfaces · D-079 the lockup, the Boil and the footer
What changed in this revision
The optical-size pin is gone, so Fraunces’ own ampersand substitution reaches the page. Category colour is retired. Twelve semantic aliases, four rhythm values and eight motion tokens are minted. One published contrast ratio is corrected. The italic is no longer preloaded and the OG card renders in real faces.

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.

Section 1

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.

RoleThe stringSet inWhere it is legal
House brandGainesville Floridan/athe entity, in prose and legal text
Wordmarkgainesvilleflorida.comSpline Sans Mono 700the masthead, with the Spur plate
Display statementGainesville / FloridaFraunces 900the footer nameplate and the OG card, nowhere else
Flagship productThis Weekend in GainesvilleFrauncesthe home hero, the calendar, the digest subject
Second verticalThings to DoFrauncesthe attractions hub and its pages
NewsletterThe Friday EmailFrauncesone name. "The Gainesville Weekend" is retired

Forbidden combinations: Fraunces 900 is never the logotype. The mono never sets the display statement. The newsletter has one name, and it is The Friday Email.

Section 2

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

Display cut · 40px and up
Micro cut · below 40px

The drift between the two cuts is shown rather than hidden. They are the same six-node topology; the micro cut carries the small-size optical correction (outer circle r42, counter 26 x 28.5 with no cant, ring 16u/13.5u). The hinge is --spur-cut-hinge: 40px and there are no exceptions to it, including inside the kit files, three of which violate it at their own declared intrinsic size and are corrected in wave 5.

Rendered, not described

16px
20px
24px
32px
40px
64px
200px

Each specimen uses the cut its own size requires. Rasterised at a true 16px the mark reads unambiguously as a G, the spur survives and there is no grey band: the limestone-ground choice was tested rather than assumed.

Colour law

DO · aquifer-deep on limestone, the default
DO · limestone reversed on the plate
NEVER · teal on aquifer-deep

The third panel is the evidence, not an illustration: it is the real mark at the real fill, and it renders as nothing. That rule was earned by putting the draft on the footer flood and getting an empty box. Plain aquifer is licensed at 200px and above only.

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

  • Never tint the counter, and never break the rim.
  • Never set the mark in ochre, palmetto or spring.
  • Never put teal on aquifer-deep. The draft was rendered on the footer flood and produced an empty panel.
  • Never use the display cut below 40px. That is what the micro cut is for.
  • Never place the mark beside a capital G. A tile is not a letter; two Gs are a stutter.
  • Never animate the mark.
Section 3

Lockups

The masthead lockup is canonical. This is the section that closes the founder's flagged open question.

RulingWhy
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.

Deferred to wave 5, stated so nobody assumes it shipped: all four lockup masters set live <text> with a Google Fonts @import and neither family is installed on the build machine, so the project’s own rsvg-convert pipeline renders them in substituted faces. They must be outlined, restated at legal intrinsic sizes, stripped of the .com tint, and logo-stacked.svg redrawn at 2.0-2.5C.

Section 4

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.

Mono keeps

The time gutter, dates, prices, counts, coordinates, sync stamps, badges, chips, nav labels, buttons, eyebrows, breadcrumbs, form labels, legal micro-type, and the masthead wordmark.

Mono loses

Addresses, price sentences, the “found via” line, footer body copy, form placeholders, empty-state sentences, and the show-more control. Roughly half of its 265 call sites, and the fix for “tiny tracked uppercase monospace is the site’s dominant texture”.

Mono’s job is a fact rather than a mood. The shipped Fraunces GSUB is [liga, rvrn] and carries no tnum. Spline Sans Mono is monospaced by construction, so every numeral column that must align is permanently the mono’s job. That is why a second family exists, and it is a better reason than “it looks technical”.

The scale

Ten steps. Anchored on 17px because 17px is what ships, not the 18px the old token claimed. The ratio is about 1.28 above the body step and about 1.20 below it: an accelerating scale, said plainly because the old comment claimed “1.25 (major third)” and was false in its own numbers. Each row is rendered live in its real face at its real size; the token name is the string a developer types.

--text-readout-xs
0.625rem · mono 600
Depot Park & the Hippodrome
--text-readout
0.75rem · mono 500
Depot Park & the Hippodrome
--text-readout-lg
0.875rem · mono 600
Depot Park & the Hippodrome
--text-meta
0.875rem · Fraunces 400 · opsz 14
Depot Park & the Hippodrome
--text-body
1.0625rem · Fraunces 400 · opsz 17
Depot Park & the Hippodrome
--text-title
1.375rem · Fraunces 500 · opsz 18
Depot Park & the Hippodrome
--text-title-anchor
1.75rem · Fraunces 700 · opsz 28
Depot Park & the Hippodrome
--text-head
2.25rem · Fraunces 400 · opsz 36
Depot Park & the Hippodrome
--text-head-lg
2.875rem · Fraunces 400 · opsz 46
Depot Park & the Hippodrome
--text-display
clamp(3.25rem, 7.4vw, 6.5rem) · Fraunces 900
Depot Park & the Hippodrome
--text-mega
clamp(2.5rem, 7vw, 5.375rem) · Fraunces 900
Depot Park & the Hippodrome

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.

opsz 26 · what shipped
Marshall & the Shambles
opsz 18 · what ships now at row size
Marshall & the Shambles
ExceptionSettingThe written reason
display and megaopsz interpolates with the clampA 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 titlesrender 22px, set opsz 1818 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 titlesrender 28px, opsz 28Above 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 stringfont-variant-ligatures: noneFraunces ships liga and the default fl ligature fires across the “gainesville / florida” word seam.

The threshold is opsz ~21.66 as the browser applies it, not the 18 in the raw FeatureVariations record: 18 is that condition denormalized without Fraunces’ avar table, which is not identity on the opsz axis. Everything the system sets at 18 still lands below it, so every ruling built on the number holds. Recorded here because the next person to dump the binary will get 18 and think this page is wrong.

Weight, leading, tracking

Leading
--leading-display 0.90
display, mega
--leading-head 1.05
head, head-lg
--leading-title 1.15
title, title-anchor
--leading-readout 1.30
all mono
--leading-meta 1.45
meta
--leading-body 1.55
body copy
Tracking
--tracking-display -0.018em
display, mega
--tracking-title -0.010em
title-anchor, section heads
--tracking-tight -0.005em
base row + card titles
--tracking-normal 0em
body, meta
--tracking-mono 0.02em
mono running data (readout-lg)
--tracking-label 0.08em
mono UPPERCASE labels/tags
--tracking-eyebrow 0.14em
mono eyebrows (widest)
Weight
--font-weight-regular 400
--font-weight-medium 500
--font-weight-semibold 600
--font-weight-black 900

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.

SurfaceDisplay voiceReadout voiceThe rule
The Friday EmailGeorgia, "Times New Roman", serifui-monospace, SFMono-Regular, Menlo, Consolas, monospaceNo 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 30Spline Sans Mono 500Each 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

FaceBytesPreloadedNote
Fraunces variable, roman, opsz 9-14467,388yes245 glyphs. fvar = [opsz 9/9/144, wght 100/900/900]. GSUB = [liga, rvrn].
Spline Sans Mono variable36,528yeswght 300-700. Monospaced, so its figures are tabular by construction.
Fraunces italic81,704NO, droppedIt 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.

Adding an axis or a face is a byte decision before it is a taste decision. The rejected proposal to add SOFT and WONK measured +53,412 B roman and about +110,000 B with an italic, to buy an ampersand that deleting one line already fixed for nothing.

Section 5

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

TokenValuegroundgr-deepgr-sinkfloodfl-deepplateJob
ground#F4EFE61.001.111.268.9812.7214.74Limestone. Primary page ground.
ground-deep#EAE3D51.111.001.138.0611.4113.22Limestone Deep. Panels, the coordinate strip.
ground-sink#DED6C41.261.131.007.1110.0711.68Limestone 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#1A1E1914.7413.2211.681.641.161.00Cypress Ink. All display + body text. 14.74:1 on ground. Also the CANCELLED label and the PROMOTED text on ochre.
ink-muted#3A3F369.438.467.471.051.351.56Secondary text. 9.43:1 on ground.
ink-soft#4B51477.146.415.661.261.782.06Meta text, the unboxed category label, a real price. 7.14:1.
ink-faint#545B4E6.155.514.871.462.072.40Text floor; the STALE dot; unknown admission. 6.15:1 on ground.
aquifer#0C6B6B5.504.944.361.632.312.68Links, venue names, eyebrows, small UI. 5.50:1 on ground. FAILS AA on ground-sink (4.36:1), use aquifer-deep there.
aquifer-deep#08484C8.988.067.111.001.421.64CTA fills, the footer flood, the ON NOW reversed chip, the Spur plate. Ground text on it 8.98:1.
spring#2AA3A02.682.402.123.354.755.50RESTRICTEDRESTRICTED 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#7FCFC41.581.411.255.698.069.35RESTRICTEDRESTRICTED TO DARK SURFACES. Footer wordmark, far rings, chip counts on the flood. 1.58:1 on ground, invisible.
palmetto#5F6B345.044.523.991.782.522.93SINGLE JOB: the plot's FREE open-ring stroke, 1.2px. 5.04:1 on ground, clears the 3:1 graphic floor.
palmetto-deep#4A55287.006.275.541.281.822.11SINGLE JOB: the word "Free" in the meta line, weight 600. 7.00:1 on ground. Free is olive in both registers.
ochre#C8862F2.652.382.103.384.795.55RESTRICTEDFILL 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#A86A1E3.863.473.062.323.293.82RESTRICTEDEDGE, 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#CFE6E21.141.021.117.8711.1512.92Body text on all three dark surfaces. 7.87:1 on flood.
flood-deep#052E3112.7211.4110.071.421.001.16NEW. 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#1A1E1914.7413.2211.681.641.161.00NEW (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-aquiferrgba(12,107,107,.05)composites #E8E8E01.081.071.061.031.041.04NEW. 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#9A34126.385.725.051.411.992.31RESTRICTEDNEW. 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.
hairrgba(26,30,25,.16)composites #D1CEC51.371.371.351.101.031.00Standard divider. Composites #D1CEC5, 1.37:1 vs ground.
hair-strongrgba(26,30,25,.32)composites #AEACA41.991.951.921.191.061.00Emphasized rule; the cancelled strike; the filled form-field left border. Composites #AEACA4, 1.99:1.
hair-tealrgba(12,107,107,.28)composites #B3CAC41.511.491.451.151.251.26Aquifer divider.
hair-floodrgba(244,239,230,.24)composites #F4EFE61.001.031.061.852.002.07Rule on aquifer-deep (composites #417071, 1.85:1); also legal on flood-deep and the plate.
tint-aquiferrgba(12,107,107,.14)composites #D4DDD51.211.211.201.071.121.11RETIRING 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-ochrergba(200,134,47,.20)composites #EBDAC11.201.181.151.211.311.36RETIRING 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 flags are not footnotes. Ochre is never text at any size. Ochre-deep is an EDGE, legal on ground and ground-deep only. Spring and shallow are dark-surface only. Admin-alert never appears on a public route.

Ledger correction · 2026-08-12

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

Thirteen aliases, zero new pigment. A semantic token never names a hex; it names a brand token, so a future palette change moves one line rather than fifty components.

Semantic tokenResolves toHexOn groundThe form that actually carries it
--signal-free-textpalmetto-deep#4A55287.00:1the word "Free", weight 600, last meta segment. NO BOX. 7.00:1
--signal-free-graphicpalmetto#5F6B345.04:1the plot's open ring, 1.2px stroke, ground fill. 5.04:1
--signal-pricedink-soft#4B51477.14:1a real price ("$19"), weight 400, same slot. 7.14:1
--signal-price-unknownink-faint#545B4E6.15:1"See source for pricing", weight 400. 6.15:1
--signal-promoted-fillochre#C8862F2.65:1SOLID BOX. The only light fill in a row.
--signal-promoted-textink#1A1E1914.74:1text inside that fill. 5.55:1, clears AA at any size.
--signal-promoted-edgeochre-deep#A86A1E3.86:11px edge. Ground and ground-deep ONLY (see the asymmetry note).
--signal-promoted-ruleochre#C8862F2.65:12px left-gutter rule bleeding 12px past the row edge.
--signal-live-fillaquifer-deep#08484C8.98:1REVERSED SOLID BOX. The only dark fill in a row.
--signal-live-textground#F4EFE61.00:1text inside that fill. 8.98:1
--signal-cancelledink#1A1E1914.74:1mono uppercase 10px, FIRST meta segment, plus a 1.4px hair-strong strike. NO HUE. 14.74:1
--signal-freshochre#C8862F2.65:18px 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-staleink-faint#545B4E6.15:1the 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 same gallery twice: in colour, then with hue removed entirely. It has to survive the second row, because the measured luminances make hue unusable as the carrier: spring 0.2922 and ochre 0.2953 are the same value, and palmetto 0.1320 against aquifer 0.1166 is a ratio of 1.09.

COLOURLIVE MUSICPROMOTEDON NOWCANCELLEDFree$19See source for pricingFRESHSTALE
GRAYSCALELIVE MUSICPROMOTEDON NOWCANCELLEDFree$19See source for pricingFRESHSTALE

Three box states, not four: no box, solid ochre, reversed aquifer-deep. Plus a strike and a pulse. Every one is legible with hue removed, which is required here rather than fastidious.

The graveyard

Ten pigments and four tints retired, with the autopsy, so nobody re-proposes category colour. Ten classes is above the ceiling for categorical colour under any conditions and far above it inside a four-hue palette; the distribution was pathological (FAMILY 42 and EVENT 22 were 52% of the home page); the taxonomy already collapsed before colour was reached, with family/community and sports/food byte-identical; and it failed in grayscale before colourblindness was considered. Two tints are still declared, marked RETIRING, only because wave 2 removes their last call sites: --color-tint-aquifer, --color-tint-ochre, --text-mono-label, --text-h4, --text-h3, --text-h2, --text-hero, --leading-hero, --leading-tight. Adding a call site to one is what pnpm lint:tokens is for.

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.

Dark mode: no, and the costing is the reason rather than the taste. 24 hardcoded hexes are React props on the Boil components and cannot follow a media query; thirteen alpha composites need second values; the ledger doubles; and four off-site surfaces do not inherit at all. What ships instead is the dark SURFACE contract above (the flood, flood-deep and the plate, with nine verified pairings), which gives the dark register for a tenth of the work.

Section 6

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.

The flood, as the footer of this page renders it. Its mask is now measured in PIXELS from the band’s bottom edge, not as a percentage of the footer. The percentage was tuned when the footer was shorter; the footer grew, and on every desktop capture the contour lines ran straight through EXPLORE GAINESVILLE, THINGS TO DO, FOOTBALL WEEKENDS, PROMOTE AN EVENT, FEATURED BUSINESS, NEWSLETTER SPONSORSHIP and four category links, reading as stray underlines on unhovered links. A pixel cannot drift when the footer gains a column.

SurfaceFate
The hero plot: rings and dots, real weekend dataKEEP and promote. The only visual asset a competitor cannot copy without the dataset.
The footer flood: flow linesKEEP. Mask fixed.
404 / error / confirmation, at 72-80pxKEEP. The largest object on the page with no competing mark.
Category, things-to-do, series, venue, about and promote hero artRETIRE (wave 5). Arcs at ~10% opacity with a filled pale disc that reads as a half-loaded image.
The 22px event-page breadcrumb BoilRETIRE (wave 5). It sits forty pixels from a 16px Spur, in a different teal.
The 34px ochre Boil on the promoted cardRETIRE (wave 2). Never ochre.
The digest mastheadADD (wave 5). A weekly static PNG of that week's plot: the one image in an inbox nobody else can produce.

Forbidden

  • Below 64px, anywhere.
  • Any viewport region where the Spur also appears at comparable size.
  • Behind body copy, nav links or legal text.
  • In ochre, or any colour outside the aquifer family.
  • `fillN` on the limestone ground: the filled inner ring reads as a half-loaded image.
  • As a preloaded asset for texture that is not legible at its rendered size.

The 64px hinge (--boil-min-ring: 64px) is a rule of the same kind as the Spur’s cut hinge, so it is teachable and enforceable. The Boil ships today at 22, 34, 72, 80 and six hero sizes with no governing rule at all.

Section 7

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.

29.6516° N 82.3248° WALACHUA COUNTY, FLSYNCED 6 HOURS AGONO DUPLICATES

The coordinate strip, the pulsing live dot, the sync stamp, the per-day counts and the “confirm details with the venue or organizer” line are the moat rendered. They stay visible on every surface and they stay in mono. Everything this system does to them is a repair, never a redesign: the dot gains a 1px ring, the stamp puts relative time first, and a stale state exists at all.

The stale state, beside the fresh one

SYNCED 6 HOURS AGO · 2026-08-12 03:28 EDTSYNCED 34 DAYS AGO · 2026-07-09 02:33 EDT

Past 36 hours since the last successful sync the dot desaturates and the pulse STOPS. A freshness system that cannot express staleness is not a freshness system, it is a decoration containing a date, which is how /submit shipped a 34-day-old stamp under the same confident pulsing ochre dot as every fresh page. Relative time comes first because nobody diffs a date against today’s date, and that is precisely why the stale stamp sat there. Wave 2 builds the component; the two marks above are the target.

Hairlines, radius, the eyebrow

hair
hair-strong
hair-teal
hair-flood

Hairlines carry all the depth in this system. With the 2px radius ceiling and the shadow-none policy they are the reason the site does not look templated. Nothing in the audit argued against any of the three.

none
xs
sm
pill

A field guide is printed square. 2px is the default and the maximum anywhere except the live dot, which is the only pill on the property.

Section 8

Motion

A namespace that did not exist. Starting position: no system and no crimes.

Motion reports. It does not perform.

TokenValueJob
--motion-instant90mscolour and border swaps on hover and focus
--motion-state160mspressed, chip on/off, filled-field border, count fade
--motion-shape240msexpand/collapse height, the recurring-program details
--motion-arrive420msthe added-since gutter rule, once per session
--motion-stagger40msdelay between staggered arrival marks. HARD CAP of 6
--ease-standardcubic-bezier(0.32, 0, 0.24, 1)everything except arrival
--ease-settlecubic-bezier(0.16, 0.84, 0.28, 1)arrival only. Decelerating
--pulse-period2.6s

Three sanctioned jobs and nothing else: liveness (the sync dot, and only the sync dot), continuity (expand/collapse, chip state, filled fields, pressed buttons), and arrival (the added-since mark, once per session, capped at six). Neither easing overshoots, and that is the point rather than an oversight: an overshoot says the interface is playful, and this product’s entire claim is that it is correct.

+ THE CONTINUITY DEMO · expand this disclosure

The highest-value motion on the site, and it costs one transition. The recurring-program disclosure currently inserts up to fifty rows in one frame under the reader’s cursor; 240ms of height at ease-standard is what lets the eye keep its place when the page grows by five thousand pixels.

Never animates

page transitions · scroll-triggered reveals · parallax · counting-up numbers · skeleton shimmer · hover lift · shadow bloom · the logo or the mark, ever · the plot drawing itself in on load · anything auto-advancing · rows animating out of a filtered list

Reduced motion, stated properly: every duration collapses to 0ms EXCEPT --motion-instant, which holds at 90ms, because a colour crossfade is not vestibular motion and removing it reads as broken rather than calm. The pulse dot stops animating but does not disappear: it holds at its mid-state ring, so the liveness signal survives as a static mark. The load-bearing rule is that no information may be encoded in motion alone: strip the motion from any signal here and the static equivalent still carries the fact. A replayable on-page toggle for this contract is wave 3.

Section 9

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

ShippedCorrect
FOUND VIA ALACHUA-LIBRARYListed from Alachua County Library District, read August 12, 2026. Confirm details with the venue or organizer.
LAST SYNC 2026-07-09SYNCED 34 DAYS AGO · 2026-07-09 02:33 EDT · CHECKING
FIELD GUIDE No. 01, on a weeklyNothing. A frozen issue number on a weekly is a freshness claim the system is not meeting.

Loading gets its own rule with its reason: NO SHIMMER. A shimmer animates where there is no data yet, which is a small lie in the same family as everything else here. Use a static hairline placeholder matching the row grid exactly, in ink-faint, with no animation, and reserve the stamp region’s width so it does not reflow when the real value lands.

Section 10

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.

SurfaceWhere it livesPolarity
Faviconsite/app/icon.svgdark on limestone
Apple touch iconsite/app/apple-icon.pngdark on limestone
App tilebrand/kit/app-tile.svgdark on limestone
Manifest theme coloursite/app/manifest.ts#F4EFE6
OG cardsite/lib/og.tsxdark on limestone
Social avatarbrand/kit/social-avatar.svgREVERSED, the single sanctioned alternate
Digest mastheadsite/emails/components/layout.tsxdark on limestone

ICON POLARITY, declared: limestone ground is canonical. Four of five surfaces and manifest.ts already agree, and a field guide is printed. The reversed limestone-on-aquifer-deep treatment is the single sanctioned alternate, permitted only where the surface is a small crop against unknown host chrome, which means the social avatar and nothing else. The GNV · FL line is dropped from the avatar because it appears on no other icon.

Section 11

Provenance

Where every ruling on this page comes from, and what it supersedes.

DocumentWhat it is
plan/v4/brand-system.mdThe 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.mdThe measured evidence base: font binaries, contrast ledger, call-site censuses, page heights.
decisions.md D-008The SPRINGS art direction. Unchanged by this system: not one new hue is introduced anywhere.
decisions.md D-074The Spur, a founder-directed amendment to the brand freeze. Mark only.
decisions.md D-076 to D-079This system: type, colour allocation, payload and the off-site surfaces, the Boil and the footer.
brand/kit/spur-lockup-spec.mdThe mark's frozen geometry and the lockup rules.
brand/kit/SPUR-PROVENANCE.mdHow the mark was chosen, including what was rejected and why. Read it before proposing a change to the mark.
brand/guidelines.htmlSUPERSEDED by this page. It is a 61KB snapshot that still shows the retired mark and contradicts production. Kept for archaeology only.

This page is generated from brand/tokens.css by site/lib/brand/tokens.ts at build time, and pnpm lint:tokens checks that the two copies of the token file have not diverged, that every ratio it publishes is arithmetically true, and that no new arbitrary type or rhythm value has entered the codebase. Run it before you commit; just check runs it for you.