A modern, full-featured job board built using Next.js with internationalization (i18n) support. Easily browse job listings across multiple languages.
The application is deployed and live at: https://job-board-chi-indol.vercel.app
The application achieves excellent performance and SEO scores as measured by Google Lighthouse:
- Node.js 21+ (tested with v21.6.2)
- npm or yarn package manager
-
Clone the repository
git clone https://github.com/jjtsou/job-board.git cd job-board -
Install dependencies
npm install
-
Environment setup
Create a
.env.localfile in the root directory:# Required: Base URL for absolute URL generation NEXT_PUBLIC_BASE_URL=http://localhost:3000Note: If you use Vercel, and you do not want to set NEXT_PUBLIC_BASE_URL in production,
VERCEL_URLis automatically provided. -
Start the development server
npm run dev
-
Open your browser Navigate to http://localhost:3000
npm run dev- Start development server with Turbopacknpm run build- Build the application for productionnpm run start- Start the production servernpm run lint- Run Biome linternpm run format- Format code with Biomenpm run check- Run all Biome checks (lint + format)
The project includes k6 stress testing scripts to evaluate application performance under load:
# Navigate to stress testing directory
cd stress-testing
# Run stress tests (requires k6 installation)
npm run test:stress # Gradual load increase to 100 users
npm run test:spike # Sudden traffic spike testingFor detailed testing instructions and configuration, see stress-testing/README.md.
- Next.js 15 with App Router for modern React server components
- TypeScript for type safety and better developer experience
- Chakra UI v3 for consistent, accessible component system
- next-intl for internationalization (English/Greek support)
- Biome for fast linting and formatting
- Used
next-intlwith Next.js App Router for seamless language switching - Implemented route-based i18n (
/en,/el) for SEO benefits - Centralized translations in JSON files for maintainability
- Leveraged URL search params for job search state (SEO-friendly)
- Used React's built-in state for form handling
- No external state management library needed for this scope
- Server-side rendering for initial page load and SEO
- API response caching with Next.js
revalidatestrategy - Optimized bundle size with tree-shaking and code splitting
- Dynamic metadata generation based on search parameters
- Proper canonical URLs and hreflang attributes
- Accessible HTML structure with semantic elements
- Custom fetch wrapper with error handling and type safety
- Built-in compensation for API data inconsistencies
- Centralized API configuration for easy maintenance
- Modular component architecture with clear separation of concerns
- Reusable UI components with consistent prop interfaces
- Responsive design with mobile-first approach
- Server Components for data fetching and SEO-critical content (job listings, metadata)
- Client Components for interactive features (search form, language switcher, pagination)
- Strategic component boundary decisions:
JobSearchFormis client-side for real-time form interactions and URL state managementJobListrenders server-side for optimal SEO and initial page performanceLanguageSwitcheris client-side for immediate user feedback
- This hybrid approach maximizes both performance (fast server rendering) and interactivity (rich client features)
- Selective hydration ensures minimal JavaScript bundle while maintaining full functionality
- Graceful fallbacks for API failures
- User-friendly error messages
- Error boundaries for component isolation
- Search Form → URL params update → Server-side data fetching
- Job Listings → Server components render with fresh data
- Language Switch → Route change → Full page re-render with localized content
This approach ensures excellent SEO, fast initial page loads, and a smooth user experience across different languages and devices.

