Dark operations console MVP for importing EasyRoutes CSV delivery exports, reviewing route sequence/ETA data, adding delivery tips or dispatcher memos, and confirming routes before dispatch.
- Next.js + TypeScript
- Tailwind CSS + shadcn-style Radix primitives
- Google Maps JavaScript API
- PostgreSQL + Prisma schema
- Docker Compose for EC2 deployment
- Default timezone:
America/Toronto - Target AWS region:
ca-central-1
cp .env.example .env
npm install
npm run devDefault local admin password is admin if ADMIN_PASSWORD is not set. Set a strong password before any shared deployment.
npm test
npm run lint
npm run build
npx prisma validate- Provision EC2 in
ca-central-1. - Configure
.envon the host; do not commit secrets. - Restrict browser Google Maps key by HTTP referrer.
- Restrict server Google Maps key by server/IP.
- (Optional temporary HTTPS) Set
TOMATONO_SSLIP_HOSTto<public-ip>.sslip.ioandCADDY_ADMIN_EMAIL, then run:TOMATONO_SSLIP_HOST=... CADDY_ADMIN_EMAIL=... docker compose --profile sslip up -d --build app caddy- This starts a temporary Caddy reverse proxy on ports
80/443for TLS. - Without
--profile sslip, app runs only on port3000.
Deployment is prepared through GitHub Actions OIDC + AWS role ARN + SSM Run Command + Docker Compose. See docs/ec2-deployment.md. The deploy workflow intentionally skips browser smoke tests and only executes the EC2 compose rollout.
Do not commit raw customer CSV files. Use anonymized/synthetic fixtures only. Avoid logging full addresses or coordinates in production logs.