A civic workforce intelligence dashboard that scrapes job postings and translates them into hiring trends, in-demand skills, and training needs for the Montgomery job market. Built for the World Wide Vibes Hackathon 2 (GenAI / vibe coding).
Workforce Pulse helps city workforce and HR leaders, department leads (especially Public Safety), and education partners:
- Detect early staffing pressure signals for critical roles (Police, Firefighters, EMS)
- Identify which skills are newly required or rising fast
- Translate demand into training programs or recruitment actions
- Coordinate and share plans across stakeholders
60-second loop: What’s changing? → What’s driving it? → What should we do next? → Who owns it?
- Framework: Next.js 14 (App Router, TypeScript)
- Styling: Tailwind CSS, shadcn/ui, Montgomery civic design tokens
- Data fetching: TanStack Query v5
- Charts: Recharts
- Job scraping: Bright Data (Scraping Browser, Playwright)
- Open data: ArcGIS FeatureServers, JobAps RSS (City of Montgomery)
- Node.js 18+
- npm
-
Clone and install
git clone <repo-url> cd workforce-pulse npm install
-
Configure environment
Copy
.env.exampleto.env.localand fill in the values. Never commit.env.localor any file containing secrets.cp .env.example .env.local
See .env.example for required variables.
-
Run the development server
npm run dev
Open http://localhost:3000.
| Command | Description |
|---|---|
npm run dev |
Start dev server |
npm run build |
Build for production |
npm run start |
Start production server |
npm run lint |
Run ESLint |
npm run test |
Run unit tests |
- Daily Pulse (Dashboard) — Critical roles, training needs, fastest-rising skills, sector strip.
- Sectors — Impact Score and hiring trends per sector. Public Safety is prioritized.
- Sector Detail — Hiring chart, critical roles, skills, missions.
- Missions — Checklist-based actions with progress tracking.
- Playbooks — Shareable action plans with likes and saves.
Jobs are aggregated automatically from multiple sources (no manual crawl required):
- JobAps — City of Montgomery official job listings (RSS: jobapscloud.com/MGM).
- USAJOBS — Federal job listings for Montgomery area (data.usajobs.gov API).
- Indeed — Via Bright Data Scraping Browser when
BRIGHT_DATA_BROWSER_WSSis configured. - LinkedIn, Glassdoor — Use the Crawl Runner at
/crawlwith Bright Data Dataset IDs for on-demand enrichment.
The job store is populated automatically on first load and refreshed every 6 hours. Vercel Cron hits /api/jobs/aggregate every 6 hours when deployed.
Jobs are fetched automatically from JobAps and USAJOBS. For USAJOBS, register at developer.usajobs.gov and add USAJOBS_API_KEY and USAJOBS_USER_AGENT (your email) to .env.local.
Workforce Pulse uses two Bright Data integrations:
-
Scraping Browser (Indeed job scraping) — Set
BRIGHT_DATA_BROWSER_WSSin.env.localwith your WebSocket URL from the Bright Data dashboard (Scraping Browser zone). -
Crawl API / Dataset API — Set
BRIGHT_DATA_API_KEYin.env.localfor the Crawl Runner and Settings. Configure Dataset ID in Settings → Bright Data. The Crawl Runner at/crawllets you trigger crawls with custom URLs.
API keys are server-side only; never expose them to the client.
- "BRIGHT_DATA_API_KEY is not configured" — Add the key to
.env.localand restart the dev server. - "BRIGHT_DATA_BROWSER_WSS" — Required for POST
/api/jobs/scrape(Indeed scraping). Get the WebSocket URL from Bright Data Scraping Browser zone. - Snapshot not ready — Crawls can take several minutes. The Crawl Runner polls automatically.
- ArcGIS / JobAps errors — Check that
NEXT_PUBLIC_ARCGIS_*andJOBAPS_RSS_URLare set in.env.local.
- docs/full-idea-project.txt — Full product specification.
- docs/claims-validation.md — Claims validation and architecture evaluation.
- docs/shimmering-forging-pudding.md — Design system and API integration notes.
- docs/sparkling-giggling-planet.md — Implementation plan.
Private — hackathon project.