EduMap Moldova is an interactive web application for exploring teaching vacancies in Moldova by district, institution, and specialty.
The project helps users quickly understand where teaching positions are available, filter vacancies by subject category, and browse vacancy cards on an interactive map.
- Interactive Moldova map with district-level vacancy data
- Vacancy filtering by specialty category
- Search and browse teaching vacancies by district, institution, and specialty
- Normalized Romanian labels for districts, institutions, and specialties
- Responsive UI for desktop and mobile use
- Dark/light theme support
- Static deployment support for subdirectories such as
/edumap/
- React
- TypeScript
- Vite
- Tailwind CSS
- Leaflet / React Leaflet
- Zustand
- Fuse.js
- Recharts
- Framer Motion
.
├── public/
│ └── data/
│ ├── moldova-districts.json
│ └── vacante_by_city.json
├── src/
│ ├── components/
│ ├── data/
│ ├── hooks/
│ ├── lib/
│ ├── pages/
│ └── types.ts
├── package.json
├── tsconfig.json
└── vite.config.tsUse Node.js 20+.
npm installnpm run devBy default, the app runs on:
http://localhost:5173npm run typechecknpm run buildThe current Vite configuration outputs the production build to:
dist/public/npm run serveBuild normally:
npm run buildUpload the contents of:
dist/public/to your website root.
The app must be built with the base path /edumap/.
$env:BASE_PATH="/edumap/"
npm run buildset BASE_PATH=/edumap/ && npm run buildBASE_PATH=/edumap/ npm run buildThen upload the contents of:
dist/public/to:
public_html/edumap/The final structure should look like this:
public_html/edumap/index.html
public_html/edumap/assets/
public_html/edumap/data/vacante_by_city.json
public_html/edumap/data/moldova-districts.jsonDo not upload the folder as public_html/edumap/dist/public/. Upload only the files inside dist/public/.
The app expects these files to be available in the public data directory:
public/data/vacante_by_city.json
public/data/moldova-districts.jsonIn production, they should be reachable at:
/edumap/data/vacante_by_city.json
/edumap/data/moldova-districts.jsonfor a subdirectory deployment.
If the project includes a PDF parser script, the typical flow is:
python update_vacancies_from_pdf.py posturi_didactice_vacante_30_06_2026.pdf --out public/data/vacante_by_city.jsonAfter updating the JSON data, rebuild the app:
npm run typecheck
npm run buildIf the deployed site shows a blank page, check these first:
- The app was built with the correct base path.
- The uploaded files are from inside
dist/public/, not the folder itself. - The JSON files are accessible in the browser.
- Browser DevTools Console has no missing asset errors.
For https://platon.md/edumap/, these URLs should open:
https://platon.md/edumap/data/vacante_by_city.json
https://platon.md/edumap/data/moldova-districts.jsonFor easier cross-platform deployment, add cross-env:
npm install -D cross-envThen add this script to package.json:
{
"scripts": {
"build:platon": "cross-env BASE_PATH=/edumap/ vite build --config vite.config.ts"
}
}After that, build with:
npm run build:platonNo license has been specified yet.