Voices of Ghana · rapid-response civic action · est. 2021 (concept)
RAISE YOUR VOICE.
A national, non-partisan drive to get every eligible Ghanaian onto the 2026 voters’ register. No party. No noise. Just the count — and your name in it.
The current campaign · nº 06
COUNT EVERY
VOICE
Roughly one in five eligible adults never makes it onto the voters’ register — not from apathy, but from friction: a missing card, a moved house, a centre nobody could find, a queue nobody could stand in. Count Every Voice exists to remove that friction, street by street, before the window closes.
We are not telling anyone how to vote. We are making sure that, when the day comes, whether you vote is your decision — not a clerical accident. That is the whole campaign. It fits on a poster, and it should.
- Check. Confirm your name and centre before deadline week — not during it.
- Carry. Ghana Card in hand; help one neighbour replace a missing one.
- Bring one person. If every registered voter registers one more, the gap closes in a single season.
Do something today · pick one
THREE WAYS
TO ACT
-
SIGN
Put your name on the pledge. It costs sixty seconds and it tells your district organiser one more person is checked, carded and counted. Numbers move officials; names move numbers.
Add your name → -
SHOW UP
Saturday registration walks run in all 16 regions through September. Two hours, your own neighbourhood, a clipboard and a route. You knock, you check, you point people to their centre.
Volunteer for a walk → -
SPREAD
Talk to three people this week — one at home, one at work, one you’d normally never ask. The poster kit below is type-only on purpose: print it anywhere, in any language, on any wall.
See the poster wall →
Movement goals — where we’re headed, not where we are
THE 2026
TARGETS
- 50,000
- pledges signed before the window closes
- 16 / 16
- regions with an active volunteer cell
- 260+
- Saturday registration walks completed
- ONE
- register that misses nobody who wanted in
Stated as targets for the 2026 drive — deliberately not claimed as achievements. A campaign that inflates its own numbers has already lost the argument for honest counting.
Concept archive · five drives, one voice
THE POSTER
WALL
Every campaign ships as pure typography — no photos, no faces, no heroes. Type prints cheap, translates fast, and belongs to whoever pastes it up. Illustrative campaigns for a fictional organisation.
- 2021KNOW YOURASSEMBLYdistrict powers, plain language
- 2022ONE TREEEACHa seedling per household
- 2023READ THEBUDGETopen town-hall ledgers
- 2024GIVE BLOODTODAYbank drives, all regions
- 2025LIGHTS ONOUR STREETSreport every dark lamp
- 2026 — NOWCOUNT EVERYVOICEthe register misses nobody
Sixty seconds · sixteen regions · one register
ADD YOUR
NAME
Signing puts you on the campaign roll — walk invitations, deadline reminders, and nothing else. No party lists, no data resale, ever. (Concept form: submissions demonstrate the flow; no real campaign is collecting data.)
Design-thinking case study
PROCESS
The brief
Adapted from a public RFQ by a high-traffic advocacy organisation seeking a rapid-response campaign platform: launch a new national campaign in days, not weeks, with a clear action funnel and zero visual dependence on photography budgets.
Concept project — adapted from a public RFQ. Frontend only; the signature counter, countdown target, pledge figures and campaign archive are illustrative concept content, framed as goals — not real statistics. Not affiliated with any real organisation, party or electoral body.
The problem
Advocacy sites die two deaths: they either shout so hard they read as partisan noise, or they hedge so carefully they inspire nothing. The design problem was a voice that is urgent but responsible — a fire alarm you trust precisely because it never cries wolf.
Direction chosen — and rejected
Chosen: the protest-poster stack. One ink-cheap palette (black, white, alarm red), one shouting typeface, torn edges and stamps — the visual grammar of things pasted on walls in a hurry, executed with editorial discipline.
Rejected: a photo-led "faces of the movement" layout (needs a photography pipeline the RFQ couldn’t fund, and faces politicise); a dashboard-first data site (numbers without a demand persuade nobody); and a multi-page campaign CMS mock (the single poster-stack page ships faster, which is the rapid-response requirement).
Key decisions & trade-offs
Honesty over hype: every figure is labelled a goal or a concept number, because a counting campaign that fakes its count is self-refuting. Type-only posters trade visual variety for infinite reproducibility. Kinetic type slams once, then holds still — urgency on arrival, readability forever after. Intended impact is framed as design goals: a sub-minute path from landing to signed pledge, and a poster system any chapter can reprint from a text file.
How this was built · teaching artifact
GUIDE
Concept & direction
Poster energy from typography alone. Anton is the shout — a single compressed weight, all-caps, leading at 0.85; Inter (variable) is the responsible voice underneath. Three colours only: near-black #0C0B09, paper #F7F5F0, alarm red #E8341C. Red on black holds 4.9:1 contrast, so the alarm colour is also a legal text colour.
Toolchain
Fable 5 as designer-engineer, directed by Hannah Kwakye. Static hand-authored HTML/CSS/JS — no framework, no build step, no libraries. Two self-hosted woff2 files (~67 KB total), preloaded. All motion is CSS keyframes plus one IntersectionObserver; the whole page ships far under the 250 KB budget.
Everything is code-drawn
An environment constraint turned creative thesis: no rasters exist anywhere. The torn-edge dividers are hand-plotted SVG polylines (preserveAspectRatio="none" stretches one jagged path to any width). The rotating stamp is an SVG <textPath> on a circle. The poster wall is CSS composition — six 3:4 cards typeset individually, each with a ghost year numeral for paste-up depth. Even the favicon is an inline SVG data-URI.
Deploy
Netlify, CI-driven from the monorepo: sites/voices-of-ghana publishes as-is with immutable asset caching and standard security headers via netlify.toml. Forms are handled by Netlify Forms at the edge — the static page never talks to a server of its own.
The signature moment, reproducibly
The slam-in hero is three words, each in a wrapper that owns opacity and a .slam-inner that owns transform — so the settle rotation (−1.2°, 0.8°, −0.6°: the paste-up crookedness) survives the animation’s forwards fill. Keyframes run scale 2.2→0.94→1 with a hard step at 55% to fake impact; a 90 ms stagger makes it percussion, not chorus. Animations start only after document.fonts.ready resolves (a 700 ms timeout guards it), so Anton never slams in as a fallback font. Under prefers-reduced-motion every keyframe, the ticker and the stamp’s 26 s spin are disabled — the hero simply is, fully settled, no JS required.
Iteration log
- Pass 1 — critique (3 widths). Hero read as centred and polite at desktop — moved to hard-left rag with the stamp overlapping the headline; the stamp in turn sat on the kicker's "(concept)" note at tablet and mobile, so the kicker now reserves the stamp's column; poster wall gained per-card rotations so the grid stopped looking like a component library; the campaign section carried a dead field of paper before the diagonal banner and was tightened.
- Pass 2 — elevation. Deepened the hero twice: the red flash-bar wipe and oversized period on VOICE., then three paste-up strips (16 REGIONS / ONE REGISTER / YOUR NAME IN IT) slamming into the dead zone under the stamp; the action card's countdown digits got tabular slabs with a once-per-second tick, and the pledge bar animates to 24% on scroll; each archive poster gained a ghost year numeral so the middles read as printed paper, not empty divs.
- Pass 3 — ship quality. Every anchor, both redirect stubs and the hub link tested; Netlify form submits with honeypot + inline success (and a
?successfallback); AA contrast audited — overlines on paper switched from red to ink, the red poster's caption lost its opacity fade; reduced-motion verified at all three widths — slams, ticker, marquee and stamp all settle fully static; zero console errors; copy proofread against the "urgent but responsible" register.