ESAT — Ethiopian Satellite Television & Radio website rebuild (Next.js 15)
# ESAT Web — Ethiopian Satellite Television & Radio
Rebuilt website for ESAT, the Ethiopian Satellite Television and Radio. Independent Ethiopian broadcasting since April 24, 2010.
## Stack
- **Next.js 16** (App Router, SSR/ISR)
- **TypeScript** strict mode
- **Tailwind CSS v4**
- **next-intl** — English (default at `/`), Amharic (`/am/`), Afaan Oromo (`/or/` scaffolded)
- **Sanity.io** — headless CMS, Studio at `/studio`
- **Vercel** — production deployment (TODO: configure project)
## Local setup
```bash
# 1. Clone
git clone
github.com
cd esat-web
# 2. Install
npm install
# 3. Environment variables
cp .env.example .env.local
# Fill in NEXT_PUBLIC_SANITY_PROJECT_ID at minimum
# 4. Dev server
npm run dev
# →
localhost (English)
# →
localhost (Amharic)
# →
localhost (Sanity Studio)
```
## Environment variables
See `.env.example` for all required variables.
| Variable | Required | Description |
|---|---|---|
| `NEXT_PUBLIC_SANITY_PROJECT_ID` | Yes | Sanity project ID |
| `NEXT_PUBLIC_SANITY_DATASET` | Yes | Sanity dataset (default: `production`) |
| `YOUTUBE_API_KEY` | M2+ | YouTube Data API v3 — episode pulls |
| `STRIPE_SECRET_KEY` | M3+ | Stripe payments |
| `STRIPE_WEBHOOK_SECRET` | M3+ | Stripe webhook signing |
| `RESEND_API_KEY` | M3+ | Newsletter (Resend) |
| `HCAPTCHA_SECRET` | M5 | hCaptcha — tip-line |
| `NEXT_PUBLIC_HCAPTCHA_SITE_KEY` | M5 | hCaptcha — tip-line |
| `NEXT_PUBLIC_PLAUSIBLE_DOMAIN` | M5 | Plausible analytics domain |
## Sanity CMS schemas
Studio at `/studio`. Schemas: `article`, `program`, `episode`, `author`, `category`, `liveEvent`, `donationTier`, `pressRelease`.
## Content rules
**Never fabricate Ethiopian news content.** Seed content only from:
1. YouTube Data API v3 (`@ESATtv` channel)
2. Wayback Machine archives of `ethsat.com` (2019–2020)
## Milestone status
- [x] M1 — Scaffold: stack, routes, fonts, theme, schemas
- [ ] M2 — Home p …