Streamline your apprenticeship search by aggregating France's top job boards into one powerful interface.
JobNexus is an apprenticeship job aggregation platform designed to consolidate listings from multiple French job boards into a single, unified interface. By integrating data from APEC, La Bonne Alternance, and Welcome to the Jungle, it provides a centralized search engine for job seekers.
The system utilizes ROME codes (Répertoire Opérationnel des Métiers et des Emplois) to standardize job categories across different providers and implements a caching layer to optimize performance and reduce external API calls.
JobNexus operates on a microservices architecture hosted on Google Cloud Platform.
The system consists of three main components:
- Frontend (Streamlit): Provides the user interface for searching and visualizing job data.
- Backend (FastAPI): Acts as an orchestrator that fetches, normalizes, and caches data from external providers.
- Infrastructure (Terraform): Manages the deployment of resources on Google Cloud Run and API Gateway.
This project utilizes a modern Python stack and cloud-native technologies.
- Language: Python 3.14
- Package Manager: Poetry
- Framework: FastAPI
- Server: Uvicorn
- Data Storage: Google Cloud Firestore, BigQuery
- Testing: Pytest (Asyncio)
- Framework: Streamlit
- Visualization: Plotly, Pandas
- Authentication: Google Auth
- IaC: Terraform
- Containerization: Docker
- CI/CD: Google Cloud Build
- Aggregated Search: Query multiple job boards simultaneously with a single request.
- Orchestration Engine: Parallel data fetching from APEC, LBA, and WTTJ to minimize latency.
- Geo-Spatial Filtering: Search capabilities based on longitude, latitude, and radius.
- Analytics Dashboard: Visual metrics regarding active jobs, top recruiters, and daily offer volume.
- Asynchronous Processing: Background tasks for data caching and archival.
JobNexus is designed to be easily extensible. To add a new job board provider (e.g., Indeed, LinkedIn), follow these steps:
-
Create a Service: Add a new file in
backend/services/(e.g.,new_provider.py). Your class must implement asearch_jobsmethod that returns a list ofJobmodels.# backend/services/new_provider.py class NewProviderService: async def search_jobs(self, query: str, ...) -> List[Job]: # Implement API call or scraping logic here return [Job(...)]
-
Register Dependency: Initialize your service in
backend/dependencies.py. -
Update Orchestrator: Inject the new service into
backend/services/orchestrator.pyand add it to the aggregation logic.# backend/services/orchestrator.py # ... inside find_jobs_by_query method searches = [ self.wttj_service.search_jobs(...), self.apec_service.search_jobs(...), self.new_provider_service.search_jobs(...) # Add your new service here ]
The backend exposes a RESTful API. Documentation is available at /docs when the server is running.
| Method | Endpoint | Description |
|---|---|---|
GET |
/search |
Main orchestrator endpoint. Searches all providers by query and location. |
GET |
/opportunities |
Retrieves aggregated opportunities stored in the database. |
GET |
/lba |
Fetches jobs specifically from La Bonne Alternance. |
GET |
/wttj |
Fetches jobs specifically from Welcome to the Jungle. |
GET |
/apec |
Fetches jobs specifically from APEC. |
GET |
/rome |
Resolves job titles to standardized ROME codes. |
- Docker
- Poetry (Python dependency manager)
- Google Cloud SDK (Optional, for deployment)
The backend handles all data logic and API exposure.
cd backend
# Install dependencies
poetry install
# Configure Environment
cp .env.example .env
# Edit .env with your API keys (APEC, France Travail, etc.)
# Start the server
poetry run uvicorn main:app --reloadThe API will be available at http://localhost:8000.
The frontend provides the dashboard interface.
cd frontend
# Install dependencies
poetry install
# Configure Environment
cp .env.example .env
# Ensure BACKEND_URL is pointing to your backend
# Launch the Dashboard
poetry run streamlit run app.pyThe UI will be accessible at http://localhost:8501.
The project includes Dockerfiles for containerized execution.
Backend
docker build -t jobnexus-backend ./backend
docker run -p 8000:8080 --env-file ./backend/.env jobnexus-backendFrontend
docker build -t jobnexus-frontend ./frontend
docker run -p 8080:8080 --env-file ./frontend/.env jobnexus-frontendInfrastructure is managed as code using Terraform.
cd terraform
terraform init
terraform plan
terraform applyContributions are what make the open-source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
- Fork the Project
- Create your Feature Branch
- Commit your Changes
- Push to the Branch
- Open a Pull Request
- Ensure you have pre-commit installed to maintain code quality.
- Write tests for new features in the
backend/testsdirectory. - Follow the existing code style (Black, Isort).
Distributed under the MIT License. See LICENSE for more information.