A complete worker dispatch and scheduling system for Hands On Movers, designed to match jobs with available workers based on zip code zones in Aurora and Lakewood, Colorado.
- β Smart Zone Matching - Automatically matches jobs to workers based on Aurora/Lakewood zip codes
- β SMS Notifications - Sends job offers and confirmations to workers via text message
- β Real-time Dispatch - Live dashboard for managing jobs and worker assignments
- β Worker Availability - Track who's available and their assigned zones
- β Schedule Management - View and manage daily schedules
- β API Integration - Ready for ARAYA AI integration for automated job intake
- Backend: Node.js + Express
- Database: PostgreSQL
- SMS: Twilio
- Frontend: HTML5 + Vanilla JavaScript
- Hosting: Railway (backend) + Netlify (dashboard)
- Aurora North: 80010, 80011, 80012, 80013, 80014, 80015, 80016, 80017, 80018, 80019
- Aurora South: 80044, 80045, 80046, 80047, 80247
- Lakewood West: 80214, 80215, 80226, 80227, 80228, 80232
- Lakewood East: 80401, 80403, 80439
cd /Users/tigermcbride/hands-on-dispatch
npm installcp .env.example .env
# Edit .env with your credentials# Create PostgreSQL database
# Then run:
npm run db:setupnpm run devThe API will run on http://localhost:3000
Open admin-dashboard/index.html in your browser or serve it with:
cd admin-dashboard
npx serve .POST /api/jobs- Create new jobGET /api/jobs- List all jobsGET /api/jobs/:id- Get single jobPUT /api/jobs/:id- Update job
POST /api/workers- Create workerGET /api/workers- List all workersPUT /api/workers/:id- Update worker
GET /api/dispatch/match-workers/:jobId- Find best workers for jobPOST /api/dispatch/assign- Assign job to workerPOST /api/dispatch/confirm/:assignmentId- Confirm dispatch
GET /api/schedule/today- Get today's scheduleGET /api/schedule?start_date=&end_date=- Get schedule by date range
GET /api/dashboard/stats- Get dashboard statisticsGET /api/zones- Get all zonesGET /api/zones/stats- Get zone availability stats
POST /api/sms/webhook- Handle incoming SMS from workersPOST /api/sms/status- SMS delivery status callback
Workers can respond to job offers via text message:
- YES or ACCEPT - Accept the job
- NO or DECLINE - Decline the job
- Job Created β System finds matching workers
- Job Assigned β SMS sent to best matching worker
- Worker Responds β System processes YES/NO reply
- Dispatch Confirmed β SMS sent with full job details
- Day of Job β Reminder SMS sent 24 hours before
See database/schema.sql for full schema including:
zones- Service area zones with zip codesworkers- Worker profiles and availabilityjobs- Job details and assignmentsjob_assignments- Worker-job relationship trackingsms_logs- SMS message history
# Make sure Railway CLI is installed
railway login
# Link to your project
railway link
# Deploy
railway up# Deploy admin dashboard
cd admin-dashboard
netlify deploy --prod --dir=.| Variable | Description | Required |
|---|---|---|
DATABASE_URL |
PostgreSQL connection string | Yes |
TWILIO_ACCOUNT_SID |
Twilio account SID | Yes (for SMS) |
TWILIO_AUTH_TOKEN |
Twilio auth token | Yes (for SMS) |
TWILIO_PHONE_NUMBER |
Twilio phone number | Yes (for SMS) |
DISPATCH_PHONE_NUMBER |
Dispatch phone for worker questions | Yes |
API_BASE_URL |
Base URL for API | Yes |
JWT_SECRET |
Secret for authentication | Recommended |
- Add Twilio credentials to
.env - Create PostgreSQL database on Railway
- Add initial workers to the system
- Test job creation and dispatch flow
- Deploy to production
For questions or issues, contact dispatch at the number configured in your environment variables.
Built for Hands On Movers ππͺ