A full-stack web application that eliminates the back-and-forth of scheduling — helping teams instantly find meeting times that work for everyone.
Meeting Time Finder lets users create scheduling sessions, submit their availability, and automatically surface the optimal meeting times for the entire group. Built as a portfolio project with production-grade architecture: deployed on AWS, secured with JWT authentication, rate-limited, and covered end-to-end with automated tests.
- User Authentication — Secure registration and login using JWT access/refresh tokens and bcrypt password hashing
- Session Management — Create or join scheduling sessions via unique invite codes
- Availability Input — Submit available time slots through an intuitive interface
- Optimal Time Finder — Algorithm automatically identifies the best meeting times across all participants
- Admin Dashboard — Full admin interface for managing users, sessions, and schedules
- Rate Limiting — API and auth-specific rate limiting to protect against abuse
- RESTful API — Versioned API (
/api/v1) with consistent error handling
| Technology | Purpose |
|---|---|
| React 18 | UI framework |
| React Router v6 | Client-side routing |
| Bootstrap | Responsive styling |
| Axios | HTTP client |
| Context API | Global state management |
| Cypress | End-to-end testing |
| Technology | Purpose |
|---|---|
| Node.js + Express | REST API server |
| PostgreSQL | Relational database |
| JWT (jsonwebtoken) | Stateless authentication |
| Passport.js | Auth middleware |
| bcrypt | Password hashing |
| express-rate-limit | API rate limiting |
| PM2 (ecosystem.config.js) | Process management |
| Docker Compose | Local database setup |
| Service | Purpose |
|---|---|
| AWS EC2 | Backend API hosting |
| AWS Amplify | Frontend hosting & CI/CD |
| AWS API Gateway | API routing |
| AWS SDK | Cloud service integration |
┌─────────────────────┐ ┌──────────────────────────┐
│ AWS Amplify │ │ AWS EC2 (Node/Express) │
│ React Frontend │──────▶│ REST API /api/v1 │
│ freetimefinder.click │ │ PM2 Process Manager │
└─────────────────────┘ └────────────┬─────────────┘
│
┌────────────▼─────────────┐
│ PostgreSQL DB │
└──────────────────────────┘
web_development_project/
├── client/ # React frontend
│ ├── src/ # Components, pages, context
│ ├── cypress/ # E2E test suites
│ ├── sample env file # Environment variable template
│ └── package.json
├── server/ # Node.js/Express backend
│ ├── routes/ # API route handlers
│ ├── middleware/ # Auth, rate limiting
│ ├── config/ # Database configuration
│ ├── db/ # SQL init scripts
│ ├── utils/ # Helper functions
│ ├── __tests__/ # Jest test suites
│ ├── docker-compose.yml # Local PostgreSQL setup
│ ├── ecosystem.config.js # PM2 config
│ ├── sample env file # Environment variable template
│ └── index.js # App entry point
└── amplify.yml # AWS Amplify build config
git clone https://github.com/ecrent/web_development_project.git
cd web_development_projectCopy the sample env files and fill in your values:
# Server
cp "server/sample env file" server/.env
# Client
cp "client/sample env file" client/.envServer .env variables:
NODE_ENV=development
PORT=3000
DATABASE_URL=postgres://user:password@localhost:5432/mydb
DB_QUERY_TIMEOUT=5000
DB_CRITICAL_TIMEOUT=15000
JWT_SECRET=your-secret-here
JWT_EXPIRES_IN=24h
REFRESH_TOKEN_SECRET=your-refresh-secret
REFRESH_TOKEN_EXPIRES_IN=7d
API_URL=http://localhost:3000
CLIENT_URL=http://localhost:3001
DB_POOL_MAX=30
DB_POOL_IDLE_TIMEOUT=30000
DB_CONNECTION_TIMEOUT=15000cd server
docker-compose up -dpsql -U user -d mydb -f db/db_init.sql# Server
cd server
npm install
npm start # Starts on http://localhost:3000
# Client (in a new terminal)
cd client
npm install
npm start # Starts on http://localhost:3001All endpoints are prefixed with /api/v1.
| Resource | Endpoint | Description |
|---|---|---|
| Auth | POST /users/register |
Register a new user |
| Auth | POST /users/login |
Login and receive JWT |
| Sessions | GET/POST /sessions |
List or create sessions |
| Schedules | GET/POST /schedules |
Manage availability |
| Optimal Times | GET /optimal-times |
Get best meeting times |
| Admin | GET /admin/* |
Admin management routes |
cd server
npm test # Run all tests
npm run test:coverage # With coverage report
npm run test:integration # Integration tests only
npm run test:security # Security tests only
npm run test:database # Database tests onlycd client
npm run cypress:open # Interactive mode
npm run cypress:run # Headless mode
npm run test:e2e # Start app + run E2E testsE2E test coverage:
auth.cy.js— Registration, login, and auth flowssession-flow.cy.js— Creating and joining sessionsschedule.cy.js— Managing availabilityresults.cy.js— Viewing optimal meeting timesadmin-flows.cy.js— Admin functionality
The application is deployed on AWS:
- Frontend — Hosted on AWS Amplify with automatic CI/CD triggered on pushes to the
productionbranch (configured viaamplify.yml) - Backend — Hosted on AWS EC2, managed with PM2 for process persistence and auto-restart
- API Gateway — AWS API Gateway routes traffic to the EC2 backend
- Database — PostgreSQL instance connected via
DATABASE_URL
This project is licensed under the MIT License.
Copyright (c) 2025 ecrent