Guetzli came about when we became too frustrated with Wordpress and its cesspool of plugins constantly breaking each other just to provide basic features like backups and multilingual pages. Guetzli is
-
Insanely simple. It's written in less than 500 lines of Python Flask.
-
Powerful. Add as many pages and languages as you like by editing the content directory using favourite local file editor, no server restarts required. Even changing the template or the configuration doesn't require a restart. Need to rollout to production? Just git push, rollout done.
-
Fast. On a puny 2GB Hetzner VPS it was measured to get 345 requests per second from the outside internet and 600 requests per second from within the same network, using the multithreaded uwsgi implementation.
What's with the name? 'Guetzli' is the Swiss German word for cookie. It's a good metaphor for this CMS, since it's small, quickly digested and comes with biscuit and chocolate.
Introducing Guetzli | Editing Guetzli Sites on the Web | Where the name comes from |
-
Fork this repository so you can create your own site.
-
Clone your repo and
cd
into it. -
Copy
sites/basic-example
orsites/minimal
into a new subdirectory of sites that holds the contents of your site. Commit it to your repo. -
sudo pip install Flask pystache ipaddress requests
. -
Feed guetzli to the python:
python ./server.py --site [site-subdir-name]
. For additional options, seepython ./server.py --help
. WARNING: This is only meant for development, do not use this for production purposes (as it could make your machine vulnerable). For production deployment please see Going Live!. -
Enjoy on localhost:5000. For a production ready deployment, please see Going Live!
-
No Database! The filesystem is more than enough for a simple multi-page web appearance.
-
File changes need to be reflected in the next request.
-
Nevertheless, hit the file system the least amount possible - use file modification dates and in-memory cache to do the least amount of File I/O possible.
-
Cache the result of all potentially expensive operations (like json.loads or even regex matches).
-
Localized posts, e.g. blogging.
-
Automatic reloading of modified resources on the next request, including
content/config.json
. You should never have to restart this server. -
Automatic pulling from changes on github and gitlab.com repositories (requires webhook setup, see Going Live!).
-
Full multilanguage support. Add as many languages as you like by editing
content/config.json
and add the linked pages in language-subfolders undercontent/pages
(see the example in the repo). Guetzli will match the one that best represents the client's request header and lists the other options just in case. -
Mustache templating - in the template, pages and posts.
-
Localized strings, defined in
content/config.json
. -
Extensions - handle user submitted content, add your own datasources to guetzli.
-
Redirect to (localized) default page if a page can't be found.
-
All URL params are checked to only contain letters, numbers, underscores and dashes (which is also the restriction for the page filenames) - no funny business in your file system!
All you need to know should be in the documentation. Otherwise, please open up an issue with your question.
-
Python version >= 2.7.x
-
Flask
-
pystache
LGPL
Michel Müller, System Architect Protogrid
Mark Schmitz, Web Engineer Protogrid
Thanks to Renato Testa, Chief DevOps Protogrid, for contributing the VPS performance benchmarks!
-
Markdown support
-
Dockerization