Full-stack agricultural mandi tracker with admin price entry, Telugu master data, season and holiday intelligence, trends dashboard, and AWS-ready deployment scripts.
# Agricultural Market Price Tracker
Full-stack web app for daily agricultural market tracking with:
- Admin-only data entry (max price only)
- Public dashboards (today, history, seasons, holidays)
- Flat item master (no category/variety split)
- Telugu names stored in DB (`name_te`)
- Per-city holidays including recurring weekly and annual rules
## Tech Stack
- Frontend: React + TypeScript + Vite + Recharts
- Backend: Node.js + Express + TypeScript + PostgreSQL
- Infra: AWS (RDS + EC2 + S3 + CloudFront), Terraform, GitHub Actions
## Project Structure
```text
market-price-tracker/
├── client/
├── server/
├── db/migrations/
├── infra/
│ ├── deploy.sh
│ ├── scripts/
│ └── terraform/
├── docker-compose.yml
└── README.md
```
## Local Setup
1. Install dependencies
```bash
cd client && npm install
cd ../server && npm install
```
2. Start PostgreSQL
```bash
docker-compose up -d
```
3. Configure backend env
```bash
cp server/.env.example server/.env
```
4. Run DB migration
```bash
cd server
npm run db:migrate
```
5. Start backend
```bash
cd server
npm run dev
```
6. Configure frontend env
```bash
cp client/.env.example client/.env
```
7. Start frontend
```bash
cd client
npm run dev
```
## Admin Bootstrap
First run auto-creates admin from backend env:
- `ADMIN_BOOTSTRAP_EMAIL`
- `ADMIN_BOOTSTRAP_PASSWORD`
Default dev values in `.env.example`:
- Email: `admin@example.com`
- Password: `ChangeMe123!`
## API Summary
Public:
- `GET /api/cities`
- `GET /api/items`
- `GET /api/prices/latest?cityId=...`
- `GET /api/prices?cityId=...&itemId=...`
- `GET /api/prices/trends?cityId=...&itemId=...&days=90`
- `GET /api/seasons`
- `GET /api/holidays?cityId=...&year=2026`
Admin:
- `POST /api/auth/login`
- `POST /api/auth/logout`
- `GET /api/admin/me`
- `GET /api/admin/masters`
- `POST /api/admin/cities`
- `POST /api/admin/units`
- `POST /api/admin/items`
- `POST /api/admin/seasons`
- `POST /api/admin/holidays`
- `POST /api/admin/prices`
- `POST /api/admin/price …