A job matching platform for the robotics industry connecting candidates with companies in the MassRobotics ecosystem.
- Backend: Node.js + Express
- Frontend: React (Vite)
- Database: PostgreSQL (with Prisma ORM)
- Authentication: JWT tokens
- PDF Processing: pdf-parse library
- Node.js 18+
- PostgreSQL 15+ (or Docker)
- npm
Option A: Using Docker
docker-compose up -dOption B: Using local PostgreSQL
Create a database named robotics_job_portal and update the connection string in backend/.env.
cd backend
# Install dependencies
npm install
# Run database migrations
npx prisma migrate dev --name init
# Seed the database with MassRobotics companies
npm run db:seed
# Start the server
npm run devThe backend will run on http://localhost:3001
cd frontend
# Install dependencies
npm install
# Start the development server
npm run devThe frontend will run on http://localhost:5173
- Go to http://localhost:5173 and click "Candidate Login"
- Register a new account or log in
- Upload your resume (PDF)
- Set your job preferences (position type, preferred work mode, location)
- Select up to 5 companies you're interested in
Companies have pre-seeded accounts. Access the company login at: http://localhost:5173/login/company
Login with:
- Company Name: Enter the company name (e.g., "Ava Robotics")
- Password:
company123
Once logged in, you can:
- Search candidates by keywords, position type, work mode, location
- Filter by submission date
- Filter to see only candidates interested in your company
- View full-page resume previews
- Download resumes
All configurable values are in backend/src/config/settings.js:
module.exports = {
MAX_PREFERRED_COMPANIES: 5, // Max companies a candidate can select
RESULTS_PER_PAGE: 10, // Pagination page size
JWT_EXPIRY: '7d', // JWT token expiration
MAX_RESUME_SIZE_MB: 10, // Max resume file size
};robotics-job-portal/
├── backend/
│ ├── src/
│ │ ├── config/settings.js # Configurable values
│ │ ├── controllers/ # Route handlers
│ │ ├── middleware/auth.js # JWT authentication
│ │ ├── routes/ # API routes
│ │ └── services/
│ │ ├── pdfService.js # PDF text extraction
│ │ └── matching/ # Modular matching system
│ ├── prisma/
│ │ ├── schema.prisma # Database schema
│ │ ├── seed.js # Company seed data
│ │ └── seedCandidates.js # Test candidate data
│ └── uploads/ # Resume storage
├── frontend/
│ ├── public/ # Static assets (logo, etc.)
│ └── src/
│ ├── config/settings.js # Frontend config
│ ├── context/AuthContext # Auth state management
│ ├── pages/ # Page components
│ └── services/api.js # API client
└── docker-compose.yml # PostgreSQL setup
POST /api/auth/register- Candidate registrationPOST /api/auth/login- Login (supports email or company name)GET /api/auth/me- Get current user
POST /api/candidates/resume- Upload resumePUT /api/candidates/profile- Update profile/preferencesGET /api/candidates/profile- Get profile
GET /api/companies- List all companiesGET /api/companies/candidates- Search/filter candidates
GET /api/resumes/:id/preview- Preview resume PDFGET /api/resumes/:id/download- Download resume
The current implementation uses keyword-based scoring. The matching system is modular and can be replaced with more sophisticated algorithms:
// backend/src/services/matching/index.js
const matcher = createMatcher('keyword'); // or 'ml', 'semantic' in the future
const rankedCandidates = matcher.rank(candidates, searchTerms);The database is seeded with 89 robotics companies from MassRobotics, including:
- Ava Robotics
- Dusty Robotics
- Realtime Robotics
- PSYONIC
- WiBotic
- And 84 more...
Copyright (c) MassRobotics. All rights reserved.