Avy by Avenga Academy - A web platform connecting students, alumni, and companies.
- Vanilla JavaScript (ES6+) - No framework dependencies
- Custom SPA Router - Client-side routing
- Tailwind CSS (CDN) - Utility-first styling
- Font Awesome 6 - Icons
- Modern ES Modules - Clean module system
- Modern web browser with ES6+ support (Chrome, Firefox, Safari, Edge)
- Local web server for development (e.g., Live Server, Python HTTP server, or any static file server)
- VS Code users: Accept the recommended extensions (Prettier, ESLint) when prompted so format-on-save and linting work out of the box.
Phase 1: Frontend Only (No Build Required!)
This is a pure vanilla JavaScript application that runs directly in the browser. No npm install, no build step, no dependencies!
- Clone the repository (or if you're using the submodule, it's already cloned)
- Start a local web server: Option 1: VS Code Live Server Extension
- Install the "Live Server" extension in VS Code
- Right-click on
index.htmland select "Open with Live Server" Option 2: Python HTTP Server Option 3: Node.js http-server (if you have Node.js)
- Open your browser and navigate to
http://localhost:8000(or the port your server uses)
Simply open index.html through any web server. The application will:
- Load Tailwind CSS from CDN
- Load Font Awesome from CDN
- Initialize the custom router
- Start on the landing page
No build process required!
avy-fe/
βββ index.html # Main HTML entry point
βββ assets/
β βββ css/
β β βββ style.css # Custom styles (animations, utilities)
β βββ js/
β β βββ main.js # Application entry point & route registration
β β βββ router.js # Custom SPA router with dynamic routes
β β βββ models/ # Data model classes
β β β βββ DataModels.js # User, Job, Company, Application, etc.
β β βββ services/ # Business logic & data layer
β β β βββ authService.js # Authentication service
β β β βββ mockDataService.js # Phase 1 mock data (570+ lines)
β β βββ controllers/ # Page controllers (12+ files)
β β βββ landingController.js
β β βββ loginController.js
β β βββ dashboardController.js
β β βββ jobBoardController.js # Bloom module
β β βββ jobDetailController.js # Bloom module
β β βββ companiesController.js # Bloom module
β β βββ profileController.js # Bloom module
β β βββ postJobController.js # Evergreen module
β β βββ candidatesController.js # Evergreen module
β β βββ adminUsersController.js # Meridian module
β β βββ adminAnalyticsController.js # Meridian module
β β βββ notFoundController.js
β βββ img/ # Images and assets (placeholder)
βββ .gitignore # Git ignore rules
βββ README.md # This file
- Hash-less routing using History API
- Route protection with authentication checks
- Role-based access control
- Automatic link interception for SPA navigation
- JWT token storage in localStorage
- Phase 1: Mock authentication (email pattern determines role)
- Phase 2: Real backend API integration
- Automatic role detection and redirection
- Controllers as Components: Each page is a JavaScript function that renders HTML
- Template Literals for Views: HTML embedded in JavaScript using template strings
- No Separate Templates: No .html files for individual pages (all dynamic)
- Data-Driven Rendering: Content generated from JavaScript data/API responses
- Benefits: Type-safe variables, easy props passing, scales to real frameworks
- ES6 modules for clean code organization
- Service layer for business logic (authService, mockDataService)
- Controller layer for page rendering (one controller per page)
- Models for data structures (User, Job, Company, etc.)
- Clear separation of concerns
π± Bloom (Student & Alumni)
- Profile management with CV builder
- Job board with advanced filters
- Direct applications to companies
- Dashboard with job matches
- Application tracking
π’ Evergreen (Company)
- Company profile management
- Job posting capabilities
- Candidate search and filtering
- Application management
- Subscription plans (Basic, Advanced, Premium)
βοΈ Meridian (Admin)
- User management
- Job moderation
- Platform analytics
- System configuration
The app uses mock JWT-based authentication with the following user roles:
- Student -
student@avy.com(or any email with "student") - Alumni -
alumni@avy.com(or any email with "alumni") - Employer -
company@avy.comoremployer@avy.com - Admin -
admin@avy.com(or any email with "admin")
Phase 1: Any password works. Role is determined by email pattern. Phase 2: Real authentication with backend validation.
Phase 1: Any password works. Role is determined by email pattern. Phase 2: Real authentication with backend validation.
Phase 1 (Current): Frontend operates independently with mock data.
Phase 2 (Coming Soon): Backend integration with Node.js or .NET APIs.
The mock data service can be easily replaced with real API calls in Phase 2!
- β Complete UI/UX with vanilla JavaScript
- β Mock authentication system
- β All pages and navigation (12+ controllers)
- β Role-based routing (student, alumni, employer, admin)
- β Responsive design with Tailwind CSS
- β Comprehensive data models (10+ classes)
- β Mock data service (6 jobs, 4 users, 4 companies)
- β Job Board with filters, Job Detail with application form
- β Profile/CV management, Company directory
- β Employer pages (Post Job, Candidate Search)
- β Admin pages (User Management, Analytics)
- π Connect to Node.js or .NET backend
- π Replace mock data service with real API calls
- π Database persistence (PostgreSQL/MongoDB)
- π File uploads (CV, photos, company logos)
- π Email notifications (SendGrid/Mailgun)
- π Real-time updates (WebSockets)
- π Advanced analytics with charts (Chart.js)
- π Payment processing for subscriptions (Stripe)
- Clone or pull the repository
- Start a local web server (see Installation section)
- Open in browser at
http://localhost:8000(or your server's port) - Try demo login:
- Email:
student@avy.com(oradmin@avy.com,company@avy.com)- Password: Any password (Phase 1 demo mode)
- Explore the dashboard based on your role!
This project demonstrates:
- Modern vanilla JavaScript (ES6+)
- ES Modules and imports
- SPA routing without frameworks
- State management with localStorage
- JWT token handling
- Responsive design with Tailwind
- Clean code architecture
- MVC-like patterns in vanilla JS
- Create controller in
assets/js/controllers/:
export default async function myPageController() {
const app = document.getElementById('app');
app.innerHTML = `<div>My Page Content</div>`;
}- Register route in
assets/js/main.js:
import myPageController from './controllers/myPageController.js';
router.addRoute('/my-page', myPageController, true); // true = requires authCreate a service file in assets/js/services/:
import apiService from './apiService.js';
class MyService {
async getData() {
return await apiService.get('/my-endpoint');
}
}
export default new MyService();- Use ES6+ features (arrow functions, destructuring, template literals)
- Follow modular architecture (controllers, services, views)
- Keep functions small and focused
- Use meaningful variable and function names
- Comment complex logic
- Prefer
constoverlet, avoidvar
Tooling: The repo uses EditorConfig (indent, line endings), Prettier (formatting), and ESLint (basic lint). With the recommended VS Code extensions, saving a file will auto-format and apply safe fixes. Keep the project clean by committing only formatted, lint-clean code.
Issue: Page shows blank or modules don't load Solution: Make sure you're using a web server (http://), not opening file:// directly
Issue: Router not working
Solution: Ensure all links use data-link attribute or navigate via window.router.navigate()
Issue: CORS errors in Phase 2 Solution: Configure backend CORS to allow your frontend origin
Copyright Β© 2026 Avenga Academy
Knowledge that matters π Avy - Connecting Students with Opportunities Phase 1: Frontend Only | Phase 2: Full Stack Integration
- Boilerplate Implementation Summary - Complete technical details and architecture
- Quick Start Guide - Getting started in 5 minutes with test accounts
- User Requirements - Full platform specifications
- Branching strategy - The story - Why we branch and how we work
- Branching strategy - Resolving conflicts - How to resolve merge conflicts
- Branching strategy - Using Github Desktop - Using GitHub Desktop for branching