A full-stack venue slot booking system for university clubs and committees. Clubs can request meeting rooms, administrators can approve or reject bookings, and everyone gets a real-time view of the master schedule — no more double-bookings or email chains.
- Global schedule — see every approved booking across all venues at a glance
- Slot booking — request a venue with automatic conflict detection
- Booking management — track request status, edit pending bookings, submit post-event reports
- Policy reference — in-app access to booking rules and guidelines
- Dashboard — pending request count, approval stats, and quick actions
- Request workflow — review, approve, or reject bookings with optional email notifications
- Master schedule — filterable calendar view of all venues
| Layer | Technologies |
|---|---|
| Frontend | React 19, TypeScript, Vite, Tailwind CSS v4, shadcn/ui (Radix UI) |
| Backend | Node.js, Express, TypeScript |
| Database | Supabase (PostgreSQL + Auth) |
| Notifications | EmailJS (optional) |
| Deployment | Nginx, PM2, GitHub Actions CI/CD |
- Node.js v18+
- npm
- A Supabase project (free tier works)
git clone https://github.com/ossdaiict/sleazzy.git
cd sleazzy# Server
cd server && npm install
# Client
cd ../client && npm installCopy the example files and fill in your values:
cp server/.env.example server/.env
cp client/.env.example client/.envserver/.env
SUPABASE_URL=<your-supabase-url>
SUPABASE_SERVICE_ROLE_KEY=<your-service-role-key>
PORT=4000
# Optional — EmailJS for approval notifications
EMAILJS_SERVICE_ID=
EMAILJS_TEMPLATE_ID=
EMAILJS_PUBLIC_KEY=
EMAILJS_PRIVATE_KEY=
APPROVAL_NOTIFY_EMAIL=client/.env
VITE_API_URL=http://localhost:4000
VITE_SUPABASE_URL=<your-supabase-url>
VITE_SUPABASE_ANON_KEY=<your-anon-key>Populate the database with sample profiles, clubs, and venues:
cd server
npx ts-node seed.ts# Terminal 1 — API server (localhost:4000)
cd server
npm run dev
# Terminal 2 — Frontend (localhost:5173)
cd client
npm run devsleazzy/
├── client/ # React frontend
│ ├── src/
│ │ ├── components/ui/ # shadcn/ui primitives
│ │ ├── lib/ # Shared utilities & composite components
│ │ ├── pages/ # Route-level pages
│ │ ├── App.tsx # Router & layout
│ │ ├── types.ts # Shared TypeScript types
│ │ └── constants.ts # Static data (venues, categories)
│ ├── vite.config.ts
│ └── .env.example
│
├── server/ # Express API
│ ├── src/
│ │ ├── controllers/ # Route handlers
│ │ ├── routes/ # Express route definitions
│ │ ├── services/ # Business logic
│ │ ├── middleware/ # Auth & request middleware
│ │ ├── types/ # Server-side types
│ │ ├── server.ts # Entry point
│ │ └── supabaseClient.ts
│ ├── seed.ts # Database seed script
│ └── .env.example
│
├── deploy.sh # Production deployment script
├── ecosystem.config.js # PM2 process config
├── nginx.conf # Nginx reference config
├── DEPLOYMENT.md # Ops & deployment guide
└── .github/workflows/ # CI/CD pipeline
| Method | Endpoint | Auth | Description |
|---|---|---|---|
GET |
/api/health |
No | Health check |
GET |
/api/venues |
No | List all venues |
GET |
/api/clubs |
No | List all clubs |
GET |
/api/public-bookings |
No | Approved bookings (public schedule) |
POST |
/api/auth/register |
No | Register a new user |
GET |
/api/auth/profile |
Yes | Current user profile |
POST |
/api/bookings |
Yes | Create a booking request |
GET |
/api/my-bookings |
Yes | Current user's bookings |
GET |
/api/bookings/check-conflict |
Yes | Check venue/time conflicts |
* |
/api/admin/* |
Admin | Admin management routes |
# Build the server
cd server
npm run build # compiles to server/dist/
npm start # runs the compiled server
# Build the client
cd client
npm run build # outputs to client/dist/
npm run preview # preview the production bundle locallyFor full VPS deployment instructions (Nginx, PM2, GitHub Actions), see DEPLOYMENT.md.
Contributions are welcome! If you'd like to help improve Sleazzy:
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Commit your changes (
git commit -m "Add my feature") - Push to your branch (
git push origin feature/my-feature) - Open a Pull Request
Feel free to open an issue for bug reports, feature requests, or questions.
This project is licensed under the MIT License.