Data Visualization / Systems · 2026
The Calypso Archive
How do you turn an accurate but unreadable spreadsheet into something the public can actually explore?
The Brief
The Kaiso Street Society's CTA Works Publication Registry existed as a spreadsheet — accurate, maintained, and completely unreadable to anyone outside the organization. Rebuilt it over nine weeks as a public, explorable archive: every calypsonian and arranger as a star in a D3-simulated constellation, sized by registered-work count, with two independent relationship layers drawn on top — publisher connections colored by PRO, and arranger-to-song credits kept as their own toggle.
Approach
Click a star and the catalogue opens: year, authorship, ISWC, publisher, arranger connections, and — for the one song with both files uploaded so far — the actual scanned score and lyrics sheet, paged through on a canvas instead of dumped into a browser's native PDF toolbar. The entire site is static by design: Airtable exports to a JSON file at build time and the whole thing prerenders except one proxy route, with Cloudflare R2 holding every photo, scan, and recording behind a proxy that never exposes a bucket URL.
Getting There
- —Built the data pipeline before anything else — Airtable → registry.json — and shipped the first constellation, connections, and artist-card build in the same initial push, then put CI (Husky + GitHub Actions) in place before writing a single feature commit, so every later change was gated from day one.
- —Replaced the first force-ring layout with real geographic zones — each country's anchor, outline, and label position are derived from its own coastline geometry, so adding a new country needs zero hand-tuning.
- —Shipped publisher connections and arranger connections as two independent toggles rather than one bundled "connections" view — collapsing them would have implied arranging is a PRO relationship, which it isn't.
- —Scaffolded a per-artist page, then built Marjorie Johnson's page as the first real example — chapter navigation, a pinned audio player, an image carousel — deliberately left un-generalized into a layout system off a single data point. A second page, for Mighty Bomber (Clifton Fitzroy Ryan), followed the same pattern with a scrubbable chapter timeline and a locked, blur-and-sign-up gallery protecting family-donated photos still awaiting release.
- —Migrated artist photos, then detail-page media, out of static files and into Cloudflare R2 behind a private read proxy, so the browser requests /api/media/... and never touches R2 directly.
- —Built the /contribute pipeline: a public submission form writing into a separate staging bucket with its own write-scoped credentials, gated by Turnstile, notifying staff via Resend with a presigned review link that expires after seven days — nothing goes live without a human moving it.
- —Implemented a rebrand around a new palette and brand identity designed in-house by KSS founder Jesse Ryan, promoting the new accent to a CSS variable, then ran an axe-core accessibility audit and fixed what the rebrand had broken before calling it done.
- —Closed with a usability pass: a search typeahead that explains why each result matched, BMI/ASCAP filter pills on the artist card, opt-in logging for searches that come up empty, and mobile zoom fixes.
The Result
The archive is live at thecalypsoarchive.com with 221 registered works across 80 calypsonians and arrangers, explorable by catalogue, PRO, or geography. It also grows itself: a public submission form writes into a moderated staging bucket, so new material can arrive without ever touching the live site until a curator moves it there. The one deliberate limitation: only one song currently has both its scanned score and lyrics sheet uploaded — that detail page is the template for what the rest of the catalogue becomes as Kaiso Street Society adds more information and secures the necessary permissions.
Stack
- —Next.js 14, App Router static-first — everything prerendered except one serverless proxy route
- —D3 (SVG, not canvas/WebGL) force simulation rendered as real DOM — free hit-testing, styling, and accessibility at 80 artists / 221 works
- —Mantine + TypeScript UI layer — brand colors live as CSS custom properties, never hardcoded
- —Cloudflare R2 media storage, always behind a Next.js proxy that forwards Range headers so audio/video seeking works like a direct R2 request
- —pdf.js renders score and lyrics PDFs to <canvas> — deliberately no native browser toolbar, no download or print invitation on archival material
- —Python (uv, PEP 723 inline scripts) standalone data pipeline, Airtable → registry.json, isolated from the Node dependency tree with its own unit tests for the transform rules
- —Cloudflare Turnstile on every public write endpoint; the submission-staging bucket runs on its own credentials, separate from the live read-only bucket
- —Resend + Mailchimp staff alerts on new submissions, double opt-in newsletter
- —Vercel Web Analytics zero config, no cookies, no consent banner required
- —Husky + GitHub Actions CI — pre-commit/pre-push hooks, Playwright for e2e, Vitest for unit tests
Skills & Tools
More Projects