This repository contains the next-generation Missing Maps website built with Jekyll, multilingual content support, and Decap CMS for content editing. The site is deployed via GitHub Pages and served at https://www.missingmaps.org.
Last updated: January 2026 Status: Production-ready (mm-website-v2)
- Framework: Jekyll (Ruby)
- Hosting: GitHub Pages (custom domain)
- CMS: Decap (GitHub backend)
- Languages: English, French, Czech, Spanish
- Content Types: Blog posts, Projects
This repo replaces the legacy Missing Maps site while maintaining compatibility with existing content and asset structures.
url: "https://www.missingmaps.org"
baseurl: ""
permalink: pretty
markdown: kramdown
highlighter: rouge
plugins:
- jekyll-environment-variables
- jekyll-paginate-v2
pagination:
enabled: true
per_page: 9
sort_field: "date"
sort_reverse: true
trail:
before: 2
after: 2
collections_dir: collections
collections:
posts:
output: true
permalink: /blog/:path/
projects:
output: true
permalink: /projects/:path/
languages: [en, fr, cs, es]
default_lang: enThe site is deployed at the domain root, therefore baseurl is empty.
Design tokens, colors, fonts, logos, and header/footer behavior are defined in _config.yml.
Key theme features:
- Custom color palette for light mode
- Self-hosted Satoshi font family
- Fixed header navigation
- Open Graph + Twitter metadata
- Multilingual navigation and menus
- Optional dark mode (currently disabled)
- Configurable footer and bottom menu
Logos are stored in:
/assets/images/logo/
Fonts are stored in:
/assets/fonts/
Content is organized into Jekyll collections, static pages, and language-specific directories.
collections/
_posts/ β Blog posts (multilingual via front-matter + i18n)
_projects/ β Project pages
pages/ β English static pages (default language)
cs/ β Czech static pages
fr/ β French static pages
es/ β Spanish static pages
_data/
i18n/ β Translation strings (YAML)
assets/ β Images, uploads, CSS, JS, fonts
- Blog posts:
/blog/{slug}/ - Projects:
/projects/{slug}/ - Pages:
/{page-slug}/(default language) - Translated pages:
/{lang}/{page-slug}/
The site supports four languages:
| Code | Language |
|---|---|
en |
English (default) |
fr |
French |
cs |
Czech |
es |
Spanish |
UI strings and navigation labels are stored in:
_data/i18n/
en.yml
fr.yml
cs.yml
es.yml
These files contain key/value translation mappings used across templates and components.
- English content lives in
pages/andcollections/ - Translated pages live in language folders (
/fr,/cs,/es) - Blog posts and projects can use front-matter fields for localized content, or language-specific files depending on workflow.
languages: [en, fr, cs, es]
default_lang: en- English pages are served at the root (
/about/) - Other languages are prefixed (
/fr/about/,/cs/about/,/es/about/)
Anyone with write access to the GitHub repository can edit content via the CMS.
Admin interface:
https://www.missingmaps.org/admin/
- Open the repository on GitHub
- Go to Settings β Collaborators
- Click Add people
- Enter GitHub username or email
- Assign permissions:
| Permission | Access |
|---|---|
| Read | β Cannot edit content |
| Write | β Can edit via Decap |
| Admin |
Once invited and accepted:
- Editor logs in via GitHub OAuth
- Content can be created and published via Decap
Deployment is handled via GitHub Pages with a custom domain.
https://www.missingmaps.org
- Source: GitHub Pages (branch or GitHub Actions depending on workflow)
- CNAME managed via GitHub Pages settings
- HTTPS enforced via GitHub Pages SSL
The legacy site repository (missingmaps.github.io) remains online to serve historical assets and prevent broken links.
At the moment, this repository uses GitHub Pages default Jekyll builds (Deploy from Branch). No custom GitHub Actions workflows are configured yet.
If needed in the future, GitHub Actions can be added to:
- Lock Ruby and Node versions
- Run multilingual build validation
- Add linting and content checks
- Deploy via a dedicated
publishbranch
This project intentionally pins Ruby and gem versions in Gemfile to avoid compatibility surprises across contributors and CI.
Current Ruby & gem versions (pinned):
source "https://rubygems.org"
ruby "3.4.1"
gem "jekyll", "= 4.4.1"
gem "jekyll-environment-variables", "= 1.0.1"
gem "jekyll-paginate-v2", "= 3.0.0"
gem "webrick", "= 1.9.1"
gem "csv", "= 3.3.5"Even though Ruby dependencies are pinned, the project may rely on external APIs / data feeds that are refreshed regularly.
- API/data updates are reviewed/updated weekly every Monday at 06:00 UTC
- When changing API integrations, validate output locally before pushing
Current branch setup:
| Branch | Purpose |
|---|---|
main |
Production and development branch |
At the moment, the project uses a single-branch workflow. If the project grows, a recommended future strategy is:
mainβ developmentpublishβ production deploymentfeature/*β individual feature branches with Pull Requests
Current setup (single-branch, Pages deploy):
- Verify the GitHub Pages build/deploy result after merges to
main - Run a local build (
bundle exec jekyll serve) before opening a PR or merging - Validate translation YAML files in
_data/i18n/when editing labels
This project pins Ruby and gem versions to ensure reproducible builds. If dependencies need to be updated, follow this process carefully.
bundle updateTo update a specific gem only:
bundle update jekyll
bundle update jekyll-paginate-v2bundle exec jekyll build
bundle exec jekyll serveCheck that:
- The site builds without warnings or errors
- Pagination works
- Multilingual routes load correctly
- No Liquid template errors appear
If using Gemfile.lock, commit it together with the Gemfile:
git add Gemfile Gemfile.lock
git commit -m "Update Ruby/Jekyll dependencies"- Test via the GitHub Pages preview URL before switching production domain
- Avoid updating Ruby and major Jekyll versions during active campaigns
bundle install
bundle exec jekyll serveLocal preview:
http://localhost:4000
- Only one repository can own the custom domain at a time in GitHub Pages.
- The legacy repository must NOT contain a
CNAMEfor missingmaps.org. - Hardcoded historical assets remain hosted in the legacy repo to avoid broken URLs.
- Always test via the GitHub Pages preview URL before switching the domain.
For technical issues or maintainership questions:
Missing Maps Tech Team Email: info@hotosm.org