my most important repo so far
# TechOpportunity Tanzania
> _"A web platform for discovering opportunities all across Tanzania."_
Discover hackathons, scholarships, competitions, conferences, workshops,
internships, fellowships, grants, and tech/AI events across Tanzania.
**This is a responsive website** (desktop, laptop, tablet, mobile browsers)
built with Next.js — not a native Android/iOS app. A future native client
could reuse the same Supabase backend unchanged; see
`docs/architecture.md` §10.
## Stack
- Next.js 16 — App Router, TypeScript, React Server Components
- Tailwind CSS v4 — styling
- Supabase — PostgreSQL, auth, storage *(to be connected)*
- Vercel — hosting *(to be connected)*
## Project structure
```text
├── app/ # Pages and layouts (App Router)
│ ├── layout.tsx # Root layout
│ ├── page.tsx # Home page
│ └── globals.css # Global styles / theme
├── components/ # Reusable UI components
├── lib/
│ ├── types.ts # Domain types (single source of truth)
│ └── data/ # DATA-ACCESS LAYER - all DB queries live here
│ └── mock-opportunities.ts # clearly-marked temporary samples
├── docs/
│ └── architecture.md# Architecture decisions - start here
├── public/ # Static assets
├── .env.example # Required variable NAMES (values never committed)
└── pipeline/ # (future) Python scraping/AI batch jobs
```
Architectural rule: **UI → `lib/data/` → database.** Components never query
the database directly. See `docs/architecture.md` §5 for why.
## Getting started
Prerequisites: Node.js 20+ and npm.
```bash
npm install
cp .env.example .env.local # fill in values yourself; never commit this file
npm run dev
```
Open
localhost.
With `.env.local` configured (staging credentials you enter yourself), the
home page lists **published opportunities from the staging database**.
Without configuration it renders empty with a console warning — builds still
pass. `lib/data/mock-opportunities.ts` re …