|
| 1 | +# Mapping Voices — build spec |
| 2 | + |
| 3 | +## What this is |
| 4 | +A static, client-side web app (no backend, no build step, deployable via GitHub Pages) |
| 5 | +that lets people explore oral-history / voice-testimony collections on an interactive |
| 6 | +map — filterable by country, theme, language, and decade. |
| 7 | + |
| 8 | +## The 5 Ws (why this exists) |
| 9 | +- **Who**: digital humanities researchers, oral historians, students, and the public |
| 10 | + interested in oral history and voice-testimony archives. |
| 11 | +- **What**: an interactive atlas — a world map with pins for real, publicly documented |
| 12 | + oral-history/voice-archive collections; click a pin (or use the filters) to see a |
| 13 | + summary and a link to the actual source archive. |
| 14 | +- **When**: now — no tool like this exists in this account, and it directly serves |
| 15 | + active digital-humanities/oral-history research interests. |
| 16 | +- **Where**: a standalone static web app, deployed on GitHub Pages. |
| 17 | +- **Why**: oral history and voice-testimony collections are scattered across dozens of |
| 18 | + institutional archives with no shared, geographic way to browse what exists — this |
| 19 | + gives that a single entry point. |
| 20 | + |
| 21 | +## Data honesty rule (important) |
| 22 | +The seed dataset must describe **real, publicly documented oral-history/voice-archive |
| 23 | +collections** (e.g. national sound archives, university oral history projects, UNESCO- |
| 24 | +listed oral tradition collections, StoryCorps, etc.) with accurate metadata and a real |
| 25 | +link to the actual collection/archive page. Do not invent fictional testimonies, |
| 26 | +recordings, or archives. It's a *seed/demo dataset* meant to make the tool immediately |
| 27 | +useful and honest, not an exhaustive index — the README must say so explicitly and |
| 28 | +explain how to add more entries. |
| 29 | + |
| 30 | +## Data schema (`data/collections.json`) |
| 31 | +A JSON array of objects, each shape: |
| 32 | +```json |
| 33 | +{ |
| 34 | + "id": "string, kebab-case, unique", |
| 35 | + "title": "string — the collection's real name", |
| 36 | + "archive": "string — the holding institution's real name", |
| 37 | + "country": "string — ISO-ish common name, e.g. 'Niger', 'United States'", |
| 38 | + "lat": "number", |
| 39 | + "lng": "number", |
| 40 | + "languages": ["array of strings, e.g. ['Hausa', 'French']"], |
| 41 | + "themes": ["array of strings, e.g. ['migration', 'oral tradition', 'women's history']"], |
| 42 | + "decade_start": "number, e.g. 1990", |
| 43 | + "decade_end": "number or null if ongoing", |
| 44 | + "summary": "1-3 sentences, plain language, on what the collection actually contains", |
| 45 | + "url": "string — a real, working URL to the collection or archive's public page" |
| 46 | +} |
| 47 | +``` |
| 48 | +Aim for ~25-30 entries with real geographic and thematic spread — don't cluster |
| 49 | +everything in one region. Include several African/Sahel-region entries (Niger and |
| 50 | +neighboring countries) alongside collections from other continents, since that region |
| 51 | +is currently under-represented in most general "oral history" tool demos. |
| 52 | + |
| 53 | +## Frontend contract |
| 54 | +The frontend reads `data/collections.json` via `fetch('data/collections.json')` — a |
| 55 | +plain relative path, no build step, works both locally (via any static server) and on |
| 56 | +GitHub Pages. Do not hardcode the dataset into the JS/HTML. |
| 57 | + |
| 58 | +## File layout (fixed — do not deviate, this is how the two build tracks stay non-conflicting) |
| 59 | +``` |
| 60 | +index.html |
| 61 | +css/style.css |
| 62 | +js/app.js |
| 63 | +data/collections.json |
| 64 | +data/schema-notes.md (short doc: how to add a new entry) |
| 65 | +.github/workflows/deploy-pages.yml |
| 66 | +README.md |
| 67 | +scripts/validate-data.mjs (Node, zero-dependency, checks collections.json against the schema) |
| 68 | +``` |
| 69 | + |
| 70 | +## Design direction |
| 71 | +Editorial, atlas-like — not a generic SaaS dashboard. Think: a printed atlas or a |
| 72 | +research archive's reading room, rendered for the web. A serif display face for |
| 73 | +titles, a neutral sans for UI chrome. Muted, paper-like background tones (not stark |
| 74 | +white, not dark-mode-first) with one confident accent color for map pins/active |
| 75 | +states. Real typographic hierarchy. The map is the hero — everything else (filters, |
| 76 | +detail panel) supports it without competing with it. |
| 77 | + |
| 78 | +## Map library |
| 79 | +Use Leaflet.js loaded from a CDN (no API key required, unlike Google Maps) with the |
| 80 | +OpenStreetMap tile layer (free, no key, attribution required per their terms — include |
| 81 | +it, it's a one-line requirement). |
| 82 | + |
| 83 | +## Accessibility & responsiveness |
| 84 | +- Filters and the detail panel must be fully keyboard-operable. |
| 85 | +- Map pins need accessible labels (not just visual markers). |
| 86 | +- Must work down to a 375px-wide mobile viewport: map on top, filters/detail panel |
| 87 | + stack below or slide in as a drawer — your call on the exact pattern, but no |
| 88 | + horizontal overflow at any width. |
| 89 | + |
| 90 | +## Deployment |
| 91 | +`.github/workflows/deploy-pages.yml` — a GitHub Actions workflow using |
| 92 | +`actions/upload-pages-artifact` + `actions/deploy-pages` to publish the repo root |
| 93 | +(or a `/docs` folder if you prefer — pick one and be consistent with the file layout |
| 94 | +above) to GitHub Pages on every push to `main`. No build step needed since this is |
| 95 | +plain HTML/CSS/JS. |
0 commit comments