WorkNow is a modern, full-featured job search platform designed for the Israeli market. It connects employers and job seekers, supporting multilingualism (Russian, English, Hebrew, Arabic, Ukranian), premium features, and seamless integration with external services like Stripe, Clerk, and Telegram.
- Authentication via Clerk (social login, JWT, MFA)
- Job posting and management for employers
- Job seeker profiles and search
- Premium access (job boosting, hidden contacts, extra features)
- Admin panel (manage users, jobs, seekers)
- Internationalization with Intlayer (Russian, English, Ukranian, Hebrew, Arabic; RTL support)
- Telegram bot notifications
- Stripe payments & subscriptions
- SEO optimization (OpenGraph, Schema.org, meta tags)
- Responsive design (mobile-first, Bootstrap + Tailwind)
- Automated tasks (cron jobs for premium, notifications)
- Content moderation (bad words filter)
- Newsletter subscription system
- Image upload and moderation
- Candidate notification system
- React 18, Vite, React Router DOM 7
- Tailwind CSS, Bootstrap 5, Bootstrap Icons, Lucide React
- Zustand (state), React Hook Form, Zod (validation)
- Intlayer (internationalization), React Hot Toast, React Helmet Async
- TypeScript support
- Node.js, Express.js
- Prisma ORM, PostgreSQL
- Clerk (authentication & user management)
- Stripe (payments & subscriptions)
- Nodemailer (email), Telegram Bot API (notifications)
- Winston (logging), Node-cron (task scheduling)
- Redis for caching
- AWS S3 for file storage
- OpenAI integration for AI features
- Clerk, Stripe, Supabase, Telegram, Intlayer, OpenAI, AWS S3
- Clone the repository:
git clone https://github.com/MostOfLuck/job-listing.git cd job-listing - Install dependencies:
npm install
- Configure environment variables:
- Copy
docker/env.exampletodocker/.envand fill in your database, Clerk, Stripe, and email credentials.
- Copy
- Setup the database:
npx prisma db push npx prisma generate # Or, to apply migrations: npx prisma migrate dev - (Optional) Generate test data:
node apps/api/utils/napcep.js
- Run the project locally:
npm run dev
You can run the entire WorkNow platform locally using Docker and Docker Compose. This is the recommended way to ensure all services (backend, frontend, database) work together seamlessly.
- Docker installed
- Docker Compose (if not included with Docker Desktop)
IMPORTANT: The Docker Compose configuration reads from the root .env file, not from docker/.env.
# Run the setup script to create environment files
cd docker
./setup-env.sh
# This will create:
# - ../.env (root directory - used by Docker Compose)
# - docker/.env (docker directory - for reference)Then edit the root .env file (in the project root directory) and fill in your credentials:
- Database credentials
- Clerk API keys (REQUIRED for frontend authentication)
- Stripe API keys
- Email credentials (Gmail or Resend)
- AWS S3 credentials (if using file uploads)
- OpenAI API key (if using AI features)
From the project root, run:
# Build and start all services (frontend, backend, database)
docker-compose -f docker/docker-compose.dev.yml up --buildNote: The env_file: ../.env directive in the Docker Compose file automatically loads all environment variables from the root .env file.
- Frontend: Open http://localhost:3000
- Backend API: Accessible at http://localhost:3001
- Postgres Database: Exposed on port 5432 (see
docker/docker-compose.dev.ymlfor credentials)
To stop all running containers:
docker-compose -f docker/docker-compose.dev.yml down# View logs
docker-compose -f docker/docker-compose.dev.yml logs -f
# Rebuild specific service
docker-compose -f docker/docker-compose.dev.yml up --build worknow-dev
# Access database
docker exec -it worknow-db psql -U postgres -d worknow- Frontend authentication errors: Make sure
VITE_CLERK_PUBLISHABLE_KEYis set correctly in the root.envfile - Backend startup errors: Check that all required environment variables are set in the root
.envfile - Email service errors: Ensure either
EMAIL_USER/EMAIL_PASS(Gmail) orRESEND_API_KEYis configured
You can also run WorkNow directly on your machine without Docker. This is useful for development and debugging.
- Node.js (v18+ recommended)
- npm (comes with Node.js)
- PostgreSQL (running locally or accessible remotely)
- Redis (optional, for caching)
- Copy
docker/env.exampleto.envand fill in your credentials (database, Clerk, Stripe, email, etc). - Make sure your PostgreSQL server is running and the credentials match your
.env.
npm installnpx puppeteer browsers install chromenpx prisma db push
npx prisma generate
# Or, to apply migrations:
npx prisma migrate devnode prisma/seed.jsIn one terminal, start the backend and frontend together:
npm run dev- This will start both the backend (on http://localhost:3001) and the frontend (on http://localhost:3000).
Alternatively, you can run them separately:
- Backend:
npm run build:server && node apps/api/index.js - Frontend:
npm run build:server && vite
- If you change the Prisma schema, re-run
npx prisma generate. - Logs and errors will appear in your terminal.
- Make sure your database is running before starting the app.
- For TypeScript compilation, use
npm run build:server.
worknow/
├── apps/
│ ├── api/ # Backend (Express, controllers, routes, services)
│ │ ├── controllers/ # Request handlers
│ │ ├── routes/ # API route definitions
│ │ ├── services/ # Business logic layer
│ │ ├── middlewares/ # Express middlewares
│ │ ├── utils/ # Utility functions
│ │ └── index.js # Main server entry point
│ └── client/ # Frontend (React, components, pages, hooks, store)
│ ├── components/ # Reusable UI components
│ ├── pages/ # Page components
│ ├── hooks/ # Custom React hooks
│ ├── store/ # Zustand state stores
│ ├── contexts/ # React contexts
│ └── css/ # Stylesheets
├── libs/ # Shared utility libraries
├── prisma/ # Prisma schema, migrations, seed scripts
├── public/ # Static files, images, locales
│ ├── images/ # Application images
│ └── locales/ # Intlayer translations
├── tests/ # Test files
├── tools/ # Development and utility scripts
├── docker/ # Docker configuration files
│ ├── Dockerfile.dev # Development Dockerfile
│ ├── Dockerfile.prod # Production Dockerfile
│ ├── docker-compose.dev.yml # Development compose
│ ├── docker-compose.prod.yml # Production compose
│ └── env.example # Environment variables template
├── config/ # Configuration files
├── package.json # Project metadata and scripts
└── README.md # Project documentation
GET /api/jobs– List job postings (with filters, pagination)POST /api/jobs– Create a new job (auth required)PUT /api/jobs/:id– Update a job (auth, owner only)DELETE /api/jobs/:id– Delete a job (auth, owner only)POST /api/jobs/:id/boost– Boost a job (premium only)
GET /api/users– Get user profile (auth required)PUT /api/users– Update user profile (auth required)POST /api/users/sync– Sync user data with Clerk (auth required)
GET /api/seekers– List job seekers (with filters, pagination)POST /api/seekers– Create new seeker profileGET /api/seekers/:id– Get specific seeker detailsPUT /api/seekers/:id– Update seeker profile (auth required)DELETE /api/seekers/:id– Delete seeker profile (admin only)
POST /api/newsletter/send-verification– Send verification emailPOST /api/newsletter/verify– Verify subscriptionGET /api/newsletter/check-subscription– Check subscription statusPOST /api/newsletter/unsubscribe– Unsubscribe from newsletter
POST /api/payments/create-checkout-session– Create Stripe checkout sessionPOST /api/payments/cancel-subscription– Cancel premium subscriptionPOST /api/payments/cancel-auto-renewal– Disable auto-renewalPOST /api/payments/activate-premium– Activate premium features
GET /api/categories– Get all job categories (with translations)GET /api/cities– Get all cities (with translations)
GET /api/messages– Get user messages (auth required)POST /api/messages– Send message to user (admin only)
POST /webhook– Handle external service webhooks (Clerk, Stripe)
