CCAI · Calgary Council Stream & AI

An operations console for civic broadcast capture.

The current dashboard is a Tailwind starter dressed in indigo gradient. This system replaces it with a calm, paper-warm operations surface — closer to a broadcast desk than a marketing page. One reserved accent (ember) carries the signal when something is genuinely live; everything else stays out of the way of the data.

Principle

Data first, chrome second.

Numbers, timestamps, and statuses are the heroes. UI chrome is muted ink on paper so operators can scan a wall of recordings without fatigue.

Principle

Reserve the ember.

The ember accent only appears when something is recording, broadcasting, or about to. It is the visual contract that says "this is real and happening now."

Principle

Operational, not decorative.

No emoji, no gradients on chrome, no "fun" tints. Monoline icons and mono-space captions give the surface the feel of a control room.

Logomark

CCAI
Council Chamber AI
The mark: an ink-black tile holding an ember tally light. The light pulses only when the system is actively capturing — same contract everywhere else in the UI.

02 · Color

Paper, ink, and one ember.

A warm paper backdrop, charcoal ink for type and primary action, and a single saturated ember reserved for live / record states. Status colors are used sparingly and only in pills, never as fills behind text.

Surface & Ink

Paper
oklch(0.985 0.004 80)
Vellum
oklch(0.965 0.006 80)
Surface
#ffffff
Ink 900
oklch(0.18 0.006 60)
Ink 700
oklch(0.36 0.006 60)
Ink 9000.18
Ink 8000.26
Ink 7000.36
Ink 5000.55
Ink 4000.66
Ink 3000.80
Ink 2000.90
Ink 1000.94

Ember — signal accent

Ember 7000.50
Ember 6000.58
Ember 5000.66
Ember 1000.94
Ember 500.97

Usage rule. Ember is reserved for: the LIVE pill, the recording dot in chrome, the "Force start recording" button, and the live-hero block. Do not use it for links, primary nav, or marketing emphasis.

Functional

Signal · Go
monitoring · completed
Caution · Processing
enqueued · refining · diarizing
Halt · Alert
failed · stale · destructive
Cobalt · Info
links · informational

03 · Typography

A display serif-grotesque, a clean UI sans, a tabular mono.

Three families. Bricolage Grotesque for display titles — carries civic, slightly editorial weight without being precious. Geist for all UI text — neutral, modern, generous x-height, not Inter. Geist Mono for captions, timestamps, IDs, and durations — anywhere numbers must line up.

Display
Bricolage · 56 / 600 · −2.5%
Council Chamber, recording.
H1
Geist · 30 / 600 · −1.5%
Three meetings broadcasting today
H2
Geist · 22 / 600 · −1%
Upcoming meetings
H3
Geist · 17 / 600
Refinement pipeline · Step 3 of 5
Body
Geist · 15 / 400
Automatically monitors and records Calgary City Council webcasts when they go live, using smart scheduling based on the official meeting calendar. Transcripts are refined with Gemini and indexed for AI search.
Small
Geist · 13 / 400
Recording started 14:30:22 MST · Combined Meeting of Council · Duration 03:42:18
Caption
Geist Mono · 11 / 500 · +14% uppercase
Last sync · 04:17 UTC · 246 meetings
Data
Geist Mono · 28 / 500 · tabular
03:42:18 · 1.84 GB

04 · Spacing & radii

A 4-base scale and operational corners.

Spacing uses an explicit 4 / 8 / 12 / 16 / 24 / 32 / 48 / 64 scale. Radii sit slightly tighter than enterprise defaults — softer than enterprise, less marketing-bubble than the indigo template.

Spacing

s-1 · 4
s-2 · 8
s-3 · 12
s-4 · 16
s-5 · 24
s-6 · 32
s-7 · 48
s-8 · 64

Radii

xs · 4
sm · 6
md · 10
lg · 14
xl · 20
pill

05 · Elevation

Four levels. Mostly flat.

The system uses a 1px hairline as the default elevation; one soft drop at e-2 for hover and one floating shadow at e-3 reserved for menus and overlays.

e-0 · hairline only
e-1 · resting card
e-2 · hover / focus
e-3 · floating menu

07 · Components / Buttons

Five variants. Live is sacred.

Primary actions are ink-black, not indigo. Ember "live" buttons are only used for record/start-broadcast/force-start. Halt is outlined in red, never solid, to avoid confusion with the live button.

Variants

Sizes

States

Icon-only (always with aria-label)

08 · Components / Status pills

Six pills. One pulses.

All status pills are mono-uppercase with a leading dot. Only the LIVE pill pulses; everything else is static so it doesn't compete for attention.

System status

Recording Monitoring Idle

Recording status

Completed Processing Failed Imported

Secondary tags (post-processing)

Segmented Transcribed Refined YouTube · Live NAS synced

09 · Components / Stat tiles

Numbers that lead.

The display serif is used for big numbers — gives weight without screaming, and pairs naturally with the mono unit label.

Total recordings
1,284
12 this week
Completed
1,251/ 1,284
97.4% success rate
Failed
33
4 vs last week
Storage used
2.46TB
+38 GB · 7 days

10 · Components / Forms

Inputs, selects, toggles.

Auto-transcribe
on completion
Search recordings
Combined Meeting 2026 Has transcript
42 results · sorted by relevance

06 · Iconography

Monoline 24, 1.5 stroke. No emoji.

All icons are mono-stroke at 24px viewbox, 1.5 stroke-width, currentColor. Inline SVG <symbol> defs in base.html; reference via <svg class="ic"><use href="#i-NAME"/></svg>. Sizes inherit from the parent context (.btn .ic = 15px, .tag .ic = 11px, default .ic stroke-width = 1.5).

record
live
play
pause
stop
eye
cal
cal-plus
list
cast
mic
transcript
wave
refresh
trash
settings
alert
check
sparkle
db
link
search
filter
more
chev
arrow-up
arrow-down
clock
folder
cloud
plus

11 · Components / Recording rows

Dense by default.

A grid-based row layout for long lists of recordings or meetings. Status pill on the left, title + caption mid, mono duration + size right. Row dividers on var(--ink-200); hover surface is var(--ink-100).

Recording
Combined Meeting of Council
May 13 · 14:30 MST · Council Chamber
00:42:18 · 412 MB
Completed
Standing Policy Committee · Community Development
May 11 · 09:30 MST · Council Chamber
03:18:42 · 1.84 GB
Refined
Processing
Public Hearing of Council
May 09 · 09:30 MST · Council Chamber
02:51:06 · 1.42 GB
Diarizing
Failed
Audit Committee
May 07 · 13:00 MST · Council Chamber
00:23:54 · 188 MB
Stale

12 · Components / Pipeline progress

A bar that maps to your steps.

Segmented bar where each segment maps to one transcription-pipeline step (segment, transcribe, diarize, refine, index). .seg.done is solid ink; .seg.active animates a streaming highlight. Labels mirror the segments below.

SPC · Community Dev · May 11
Refining · 4/5
Segment Transcribe Diarize Refine Index

13 · Patterns / LIVE hero

The signature block.

When a BroadcastJob is in state live, the dashboard's hero becomes an ink-black telemetry slab with the ember pulse, an audio waveform, and live counters. This is the one moment in the entire system where the brand truly turns on. The page template also flips <body data-live="1"> so the sidebar brand-mark ember-pulse animates in lockstep (PR1 T105).

Live broadcast

Combined Meeting of Council

Room Council Chamber · started 14:30 MST · YouTube
Open stream
Elapsed
00:42:18
Captured
412 MB
Bitrate
3.84 Mbps

14 · Patterns / Dashboard composition

The system, composed.

A condensed preview of the home page rebuilt on the system — same data, same actions, different surface. The dashboard renders the §13 LIVE hero conditionally above the stat tiles and the two-column "Upcoming meetings" / "Active pipelines" grid.

Live broadcast

Combined Meeting of Council

Room Council Chamber · started 14:30 MST
Elapsed
00:42:18
Captured
412 MB
Bitrate
3.84 Mbps
Recordings
1,284
Completed
1,251
Failed
33
Storage
2.46TB
Active pipelines
3 running
SPC · Community Dev · May 11Refining · 2/5
Council · May 10Transcribing · 3/5
Public Hearing · May 09Diarizing · 4/5