A full-stack job portal built with the MERN stack, featuring a user-facing job platform and a dedicated administration panel.
- Emberly - User Platform: https://emberly-one.vercel.app/
- Emberly Admin: https://emberly-admin.vercel.app/
- Backend API: https://emberly-backend.onrender.com/
- User registration and authentication
- Email verification with OTP
- OTP resend with cooldown and request limits
- Secure JWT-based authentication
- Forgot password / reset password
- User profile management
- Resume upload
- Browse available jobs
- Search and filter jobs
- View company information
- Apply for jobs
- Save jobs
- Save interview questions
- Company-specific interview questions
- Role-specific interview questions
- Interview preparation resources
- Responsive UI
- Dark/light theme support
A separate administration interface for managing Emberly's platform data.
- Admin authentication
- Dashboard
- Job management
- Company management
- Company interview questions
- Role interview questions
- Add and manage job listings
- Dedicated admin UI
emberly/
│
├── frontend/ # User-facing React application
│ ├── src/
│ ├── public/
│ └── package.json
│
├── admin/ # Admin React application
│ ├── src/
│ ├── public/
│ └── package.json
│
├── backend/ # Node.js + Express API
│ ├── config/
│ ├── controllers/
│ ├── middleware/
│ ├── models/
│ ├── routes/
│ ├── utils/
│ ├── uploads/
│ ├── server.js
│ └── package.json
│
└── README.md
- React
- Vite
- React Router
- Axios
- Tailwind CSS
- Lucide React
- JavaScript
- React
- Vite
- React Router
- Axios
- Tailwind CSS
- Lucide React
- Node.js
- Express.js
- MongoDB
- Mongoose
- JWT
- bcrypt
- CORS
- Nodemailer/Brevo email API integration
- Cloudinary
- Frontend: Vercel
- Admin: Vercel
- Backend: Render
- Database: MongoDB
- File Storage: Cloudinary
- Email: Brevo
Emberly uses JWT-based authentication.
User Authentication Flow
Sign Up
↓
Verification OTP
↓
Email Verification
↓
Sign In
↓
JWT Authentication
↓
User Dashboard
Password Recovery
Forgot Password
↓
Email
↓
Reset Password
↓
Sign In
Environment variables are required for the frontend, admin panel, and backend.
Frontend
VITE_API_URL=""
Admin
VITE_API_URL=""
Backend
MONGODB_URL=your_mongodb_connection_string
JWT_SECRET=your_jwt_secret
BREVO_BASE_URL=your_brevo_base_url
BREVO_API_KEY=your_brevo_api_key
EMAIL_USER=your_email
CLOUDINARY_NAME=your_cloudinary_name
CLOUDINARY_API_KEY=your_cloudinary_api_key
CLOUDINARY_SECRET_KEY=your_cloudinary_secret_key
FRONTEND_URL=frontend_deployed_url,admin_deployed_url
- Clone the repository
git clone https://github.com/nihalsheikh/emberly.git
cd emberly
- Start the Backend
cd backend
npm install
npm start
- Start the User Frontend
cd frontend
bun install
bun run dev
- Start the Admin Panel
cd admin
bun install
bun run dev
The frontend applications communicate with the Express backend through REST APIs.
┌─────────────────────┐
│ MongoDB │
└──────────▲──────────┘
│
│
┌──────────┴──────────┐
│ Express Backend │
│ Node.js / REST API│
└───────▲───────▲─────┘
│ │
┌─────────┘ └─────────┐
│ │
┌─────────┴─────────┐ ┌─────────┴─────────┐
│ User Frontend │ │ Admin Panel │
│ React + Vite │ │ React + Vite │
└───────────────────┘ └───────────────────┘
/api/auth
/api/user
/api/company
/api/job
/api/interview
/api/application
/api/saved
/api/inquiry
The backend follows a controller/route/model structure:
backend/
│
├── config/
│ └── db.js
│
├── controllers/
│ └── ...
│
├── models/
│ └── ...
│
├── routes/
│ └── ...
│
├── middleware/
│ └── ...
│
├── utils/
│ └── emailService.js
│
└── server.js
Emberly implements several security measures:
- Password hashing with bcrypt
- JWT authentication
- Protected API routes
- Role-based access control
- Email verification
- OTP expiration
- OTP resend cooldown
- OTP resend limits
- Environment variables for sensitive credentials
- CORS configuration for deployed applications
Frontend & Admin
Vercel
Backend
Render
Nihal Sheikh
This project is currently intended for personal/project use.