This repository hosts the source code for the official QGIS Blog Website:
🌍 https://blog.qgis.orgHere you'll find everything you need to build, develop, and contribute to the QGIS Blog Website.
This repository is only for the main QGIS Blog Website (blog.qgis.org).
If you are looking for the source code or want to contribute to QGIS subdomain websites, please visit their respective repositories below.
Each subdomain has its own codebase and contribution process:
- plugins.qgis.org (GitHub: QGIS-Plugins-Website) – QGIS Plugins Repository
- hub.qgis.org (GitHub: QGIS-Hub-Website) – QGIS Resources Hub
- feed.qgis.org (GitHub: qgis-feed) – QGIS Feed Manager
- qgis.org (GitHub: QGIS-Website) – QGIS Main Website
- members.qgis.org (GitHub: QGIS-Members-Website) – QGIS Sustaining Members Portal
- certification.qgis.org (GitHub: QGIS-Certification-Website) – QGIS Certification Programme Platform
- changelog.qgis.org (GitHub: QGIS-Changelog-Website) – QGIS Changelog Manager
- uc2025.qgis.org (GitHub: QGIS-UC-Website) – QGIS User Conference Website
Table of Contents
The QGIS Blog Website (blog.qgis.org) is the official blog for the QGIS project. It publishes news, release announcements, grant reports, sustaining member updates, and community stories. The site is built with Hugo and uses the QGIS Hugo Website Theme. Blog posts are written by QGIS team members and imported from the WordPress REST API.
The QGIS Blog is the official QGIS project blog, written by QGIS team members and contributors. It is not an RSS aggregator. To publish a post on the blog, see CONTRIBUTING.md.
If you are looking to have your personal QGIS-related blog listed, please visit the QGIS Planet instead.
Blog posts live in content/posts/ as Markdown files with HTML front matter. See CONTRIBUTING.md for the full guide including images and front matter reference.
This project is licensed under the MIT License. See the LICENSE file for details.
QGIS-Blog-Website/
├── 🖼️ assets/ # Mainly used to store the schedule.csv file
├── ⚙️ config/ # Hugo configuration files
├── 📄 content/ # Markdown content files (pages, posts)
├── 🗄️ data/ # Data files (JSON) for site variables (feed, languages, subscribers)
├── 🖼️ img/ # Images files used by this README
├── 🧩 layouts/ # Hugo templates and partials
├── 🧪 playwright/ # Playwright end-to-end test scripts
├── 📦 public/ # Generated site output (after `hugo` build)
├── 🗂️ resources/ # Hugo-generated resources (e.g., minified assets)
├── 🛠️ scripts/ # Utility scripts for development/maintenance/harvesting
├── 📄 static/ # Static files served as-is (e.g., favicon, robots.txt)
├── 🎨 themes/ # Hugo themes
├── ⚙️ config.toml # Main Hugo configuration file
├── 🤝 CONTRIBUTING.md # Contribution guidelines
├── 🐍 fetch_feeds.py* # Script to get sustaining members and other feeds to update the planet website
├── 📜 LICENSE # Project license
├── ⚙️ Makefile # Build/Deployment automation commands
├── 📖 README.md # Project overview and instructions
├── 📋 REQUIREMENTS.txt # Python dependencies (pip)
├── 🐚 flake.nix # Nix flake environment definition
└── 💡 vscode.sh* # VSCode helper script for Nix development environment
We are fine with using LLM's and Generative Machine Learning to act as general assistants, but the following three guidelines should be followed:
- Repeatability: Although we understand that repeatability is not possible generally, whenever you are verbatim using LLM or Generative Machine Learning outputs in this project, you must also provide the prompt that you used to generate the resource.
- Declaration: Sharing the prompt above is implicit declaration that a machine learning assistant was used. If it is not obvious that a piece of work was generated, include the robot (🤖) icon next to a code snippet or text snippet.
- Validation: Outputs generated by a virtual assistant should always be validated by a human and you, as contributor, take ultimate responsibility for the correct functionality of any code and the correct expression in any text or media you submit to this project.
The scripts/ folder contains utility scripts to assist with data loading, and project maintenance. Below is a summary of each script:
| Script Name | Description |
|---|---|
fetch_feeds.py |
Fetches sustaining members and other feeds to update the website |
vscode.sh |
Launch VSCode with all settings and extensions needed to productively work on this project |
scripts/get_commit_hash.sh |
Get the current commit hash and write it in config/commit.toml for the website version. |
scripts/resize_image.py |
Contains utilities to optimize images (resize, transform to webp, check validity). |
scripts/import_wordpress.py |
Import posts from blog.qgis.org via the WordPress.com REST API into content/posts/. |
✏️ Note: Run each script from the project root. Some scripts may require environment variables or configuration—see comments within each script for usage details.
The development environment is using Nix flakes. Please visit https://nixos.wiki/wiki/Flakes for more details.
Start the Nix development environment by running:
nix develop # Add --experimental-features 'nix-command flakes' if you haven't enable Nix flakes
hugo server
# If you want to run VSCode:
./vscodeTo build the website:
nix build .#packages.x86_64-linux # Add | cachix push QGIS-Blog-Website to push it to cachixWe welcome contributions! Please read the CONTRIBUTING.md for guidelines on how to get started.
Have questions or feedback? Feel free to open an issue or submit a Pull Request!
- Tim Sutton – Original author and lead maintainer of the QGIS Blog Website project
- Kontur Team – Responsible for the design and development of the current website theme
- Lova Andriarimalala – Core developer and ongoing maintainer
- QGIS Contributors – See the full list of amazing contributors who have helped make this website possible.
Made with ❤️ by Tim Sutton (@timlinux), Lova Andriarimalala (@Xpirix) and QGIS Contributors.

