# Swahili Jazz — official website
Static, dependency-free production site recreating the supplied reference design,
built entirely from the supplied assets and content JSON.
Open `index.html` directly in a browser, or serve the folder — both work. There is
no runtime `fetch`, no framework and no CDN.
---
## Layout
```
index.html generated — do not edit by hand
robots.txt generated — mirrors the noindex flag
data/site-content.json ALL site content (single source of truth)
Assets/juma-tutu-links.json canonical URLs, supplied — referenced, never duplicated
Assets/ original supplied assets, untouched (never served)
build/generate.mjs renders index.html from the JSON
build/build-images.py Assets/ -> static/img/ WebP derivatives
build/icons.mjs inline SVG icon set
static/css/styles.css design system + sections
static/js/main.js interactions (vanilla, ~7 KB)
static/fonts/ self-hosted Playfair Display / Montserrat / Inter (woff2)
static/img/ optimized WebP derivatives + manifest.json
```
> **Why `static/` and not `assets/`:** Windows filenames are case-insensitive, so a
> folder named `assets/` silently merges into the supplied `Assets/` folder. The
> build output is kept under `static/` so the originals stay clean and separate.
>
> **Only `index.html`, `robots.txt` and `static/` are deployed.** `Assets/` (21 MB of
> full-resolution originals) is a build input and must never be uploaded.
## Editing content
Everything visible on the page comes from `data/site-content.json` — navigation,
headings, paragraphs, the five services, events, client list, gallery captions,
footer and calls to action.
URLs are **never** written into the content file. They are referenced with an `@`
token that resolves against the supplied `Assets/juma-tutu-links.json`:
| Token | Resolves to |
|---|---|
| `@bookTheBand` | booking enquiry `mailto:` | …