Horn of Africa news site
# HORNAFRIKA
**The Horn of Africa, Connected.**
A regional news and information platform covering Somalia, Ethiopia, Djibouti and
Eritrea — built so that all four countries are first-class, and so that the
stories which cross borders have somewhere to live.
## Running it
```bash
npm install
npm run db:reset
npm run dev
```
Then open .
`db:reset` recreates the SQLite database and seeds it with 4 countries, 27
regions, 10 sections, 46 articles, 12 videos, 8 authors, 5 user accounts, 37
wire sources, and roughly 49,000 synthetic read events (so the trending ranking
has real data to sort).
To pull live headlines into the wire:
```bash
npm run wire -- --force
```
## CMS
Sign in at .
| Email | Role | Can |
|---|---|---|
| admin@hornafrika.com | Super Admin | Everything, including users and ad slots |
| editor@hornafrika.com | Editor | Publish anything, control the homepage |
| journalist@hornafrika.com | Journalist | Create and edit own work, submit for review |
| contributor@hornafrika.com | Contributor | Draft own work, submit for review |
| moderator@hornafrika.com | Moderator | Community moderation only |
Password for all seeded accounts: `hornafrika`. **Change these before deploying.**
## Stack
- **Next.js 15** (App Router, React Server Components) — reader pages render on
the server and ship almost no JavaScript
- **TypeScript**, strict
- **Tailwind CSS v4**
- **Prisma** over **SQLite** — moving to Postgres is a `datasource` change; no
model depends on a SQLite-specific feature
- **Auth**: JWT in an httpOnly cookie (`jose`), passwords hashed with `bcryptjs`
## Structure
```
src/app/(site)/ public site — carries the header, ticker and footer
src/app/admin/ the CMS — its own frame, gated by middleware
src/app/api/ newsletter signup, OG image generation
src/components/ shared UI
src/lib/ data access, search, auth, formatting
prisma/ schema and seed
docs/superpowers/ the design spec this was built from
``` …