This project improves the usability and mobile experience of an existing Workshop Booking System without changing backend logic
The original interface had issues with navigation clarity, mobile responsiveness, and form usability. My goal was to solve these practical problems by redesigning the frontend with a mobile-first approach, clearer user flows, and consistent UI patterns.
Rather than just improving visuals, the focus was on making key user actions—like logging in, browsing workshops, and checking status—faster, clearer, and more intuitive.
| Problem in Original UI | Improvement Made |
|---|---|
| Poor mobile usability | Mobile-first responsive layout |
| Confusing navigation flow | Simplified navigation with hamburger menu |
| Inconsistent form structure | Standardized and cleaner forms |
| Lack of feedback during actions | Added loading states and API feedback |
| Important details not visible | Highlighted workshop info (date, status, location) |
- Mobile-first layout for better usability on smaller screens
- Simplified navigation across core pages
- Consistent form design and validation feedback
- Improved visibility of important workshop details
- Loading indicators and error handling for better user feedback
- Route-based lazy loading for improved performance
- React (Vite)
- Tailwind CSS
- Axios
- Django
- Django REST Framework
- REST APIs
The system follows a clean separation of concerns:
- React handles UI and user interactions
- Django manages backend logic, authentication, and database operations
- Axios is used for communication between frontend and backend
Flow:
User → Frontend (React) → Backend (Django) → Database → Response → UI Update
I mainly followed clarity, consistency, and task-first design. Most users come to do simple tasks like login, check workshops, or view status, so I made these actions easier to spot. I also kept buttons, spacing, and form patterns similar across pages so the UI feels familiar while moving through the app.
I used a mobile-first approach because the portal is often used on phones. I first fixed layouts for smaller screens, then scaled them for tablet and desktop with responsive classes. I paid extra attention to navigation, forms, and workshop cards so users can use the app comfortably without zooming or horizontal scrolling.
I avoided heavy animations and large visual effects. The goal was to improve usability without making the app feel slow. I used route-level lazy loading so pages are loaded when needed instead of loading everything at startup. This keeps the UI simple while still improving the initial load experience.
During setup, CORS issues came up between React and Django. I fixed it by adding a simple proxy setting in the Vite config and updating one Django URL line. The backend functionality stayed the same.
The hardest part was keeping the experience consistent across login, register, workshop, and profile pages on different screen sizes. I handled this by reusing the same layout spacing pattern, validating each flow step by step, and checking before/after screens for each important page.
- Clone the repository.
- Install dependencies:
pip install -r requirements.txt
- Apply migrations:
python manage.py makemigrations python manage.py migrate
- Create superuser:
python manage.py createsuperuser
- Run backend server:
python manage.py runserver
- Move to frontend folder:
cd workshop-frontend - Install dependencies:
npm install
- Create a
.envfile:VITE_API_URL=http://localhost:8000/workshop
- Start frontend:
npm run dev
Note: The statistics view opens the existing Django-based statistics dashboard.
Demo Video: Link to Demo Video
- Code is readable and well-structured
- Git history shows progressive work (no single commit dumps)
- README includes reasoning answers and setup instructions
- Screenshots included (before/after)
- Code documented where necessary








