Interactive, open-source and free world atlas — the map is the interface.
WikiMaps lets you explore how the world's political borders evolved throughout history, directly on a full-screen map, via a time slider. Inspiration: the map-filter system of Europa Universalis / Paradox games.
English-first project. Code, comments, docs, commits, PRs, branches and issues are all in English. The app itself ships localized in English + French.
- Next.js 16 (App Router) + React 19 + TypeScript strict
- MapLibre GL JS (WebGL rendering) — Phase 2 integration
- Tailwind CSS v4 (off-map UI only)
- next-intl 4 (native EN/FR i18n)
- Docker multi-stage (Node 24 → Nginx) + docker-compose
- GitHub Actions → GHCR
npm install
npm run dev
# → http://localhost:3000 (redirects to /en or /fr)docker compose up --build
# → http://localhost:3000| Command | Description |
|---|---|
npm run dev |
Next.js development server |
npm run build |
Build + static export (→ out/) |
npm run lint |
ESLint (flat config, next + TS strict) |
npm test |
Unit tests (Vitest) |
npm run test:watch |
Tests in watch mode |
npm run format |
Format the code with Prettier |
npm run format:check |
Check formatting (used in CI) |
- Localized routes:
/enand/fr(prefix always present), English-first. - Since the static export is served by Nginx, Accept-Language detection and
the
/→/en | /frredirect are handled by Nginx (seenginx.conf); Next middleware is unavailable in export mode. - Language toggle in the UI, persisted in
localStorage.
wikimaps/
├── app/[locale]/ # Localized routes (page = the map)
├── components/ # Map, LanguageSwitcher, Attribution…
├── i18n/ # routing + request config (next-intl)
├── messages/ # en.json, fr.json
├── data/ # historical GeoJSON (Phase 1)
├── docs/ # project documentation
├── Dockerfile # multi-stage → Nginx
├── docker-compose.yml
└── nginx.conf
- CI (
ci.yml): lint + test + format + build, then build & push the Docker image to GHCR onmain. - CodeQL (
codeql.yml): security analysis (push, PR, weekly). - Dependabot (
dependabot.yml): weekly updates (npm, GitHub Actions, Docker). - Tests: Vitest + Testing Library (
*.test.tsxnext to components). - Commits: Conventional Commits enforced by commitlint (
commit-msghook), with the project typesdata:andi18n:. - Consistency:
.editorconfig+.gitattributes(LF line endings). - Deployment (
deploy.yml): VPS skeleton (pull from GHCR over SSH), manual and disabled until secrets /vars.DEPLOY_ENABLED=trueare set. - Observability (enable in Phase 6): variables prepared in
.env.example(Sentry for client errors, Plausible for analytics).
- Historical borders: Historical Basemaps — CC BY-SA 4.0
- Multilingual metadata: Wikidata — CC0
- Basemap: Natural Earth — public domain
Contributions (code, data, translations) are welcome — see CONTRIBUTING.md.
Commits follow Conventional Commits:
feat:, fix:, data:, i18n:, docs:, chore:.
MIT © WikiMaps contributors