Zola: A fast static site generator in a single binary
getzola.org
getzola.org
Anyway, I liked this line from the Github:
> Hugo gets ehh for the template engine because while it is probably the most powerful template engine in the list (after Jinja2) it personally drives me insane, to the point of writing my own template engine and static site generator. Yes, this is a bit biased.
This seems to be the life cycle of static site generators (SSG). It works at first, but you end up wanting to design your own custom SSG once you run up against something that goes against your mental model of how things should work.
I did this exact thing when I got frustrated with Hugo. I made my own custom SSG in order to create my blog.
The other thing that tends to happen with SSGs is that it can be a lot more fun to play around with the tech than actually writing blog posts!
If you're interested you can read here to see how I made an SSG for my blog:
With root access to the server / just good old wget, are there benefits to using the plugins/services? Which would you suggest? Would be grateful if you shared your experience.
My daydream is to make a _good_ technical documentation system with it that is usable by the everyman, but it's still just a bit too much of a stretch. Markdown + pandoc + LaTeX templates get close, but LaTeX templating is a nightmare, and markdown is far too limiting and lacks expressivity (without ad-hoc DSL's slapped on top).
If anyone has a good pollen tutorial or example repo, I'd _love_ to know of it.
I'm happy you coded your own SSG, and if you're happy with it it's cool, but maybe your painpoints with zola are valid for other people as well and we could try to fix them for everyone :)
The parent listed static site generators including Gatsby, Hugo, and Jekyll. I suggested NextJS is a superior option to those 3, because (among many other things) it supports "export" of a fully static, pre-rendered site, which puts it -- unambiguously! -- in the "JAMstack SSG tools" category. So I'm baffled by the downvotes, and your dismissal.
What am I missing? Thanks in advance!
PS Edit to add: NextJS is even listed, as the 1st result, in the parent's jamstack link!
And total trust is PHP.
In the middle is the whole realm of somewhat-trusted, where the templates can embed varying degrees of executable script, but you are at pains to let users know that too much embedding is a bad practice, and that especially if they're "just a designer", they should work with someone from software team to implement a properly-encapsulated solution for whatever it is they want to do.
I think people their life harder when they go out of their way to avoid using PHP when really it is suited towards these types of problems.
There is a middle ground. I hit this point in Jekyll when I wanted Insanely Great image thumbnailing that no extant Jekyll plugin could provide, ended up writing my own tool to do that, but didn't want to duplicate the rest of Jekyll's functionality too. It's kiiinda hacky and I probably should propose the interface changes upstream if I keep doing this, but a very light monkey-patch lets my tool pretend to be a Jekyll::StaticFile that just happens to write out many separate files: https://github.com/okeeblow/DistorteD/blob/master/DistorteD-...
This has been my experience also[0]. Instead of writing I wound up a side quest to see if I could get Project Mallard[1] to do what I wanted.
[0] https://twitter.com/jacques_chester/status/13440340126086184...
It's something that feels highly generic, and so programmers jump on the chance to genericize it, but may not actually be that useful to have as a thing you can grab off the shelf
I had a SSG blog before. After stop using it for half year and came back, I found I had to relearn the whole thing to be able to make it work again. Add any function is a PITA. Totally wasting of time.
Not to mention that wordpress isn't static, which makes hosting more complicated & expensive.
Making a Wordpress theme is more complex, and is full of footguns for security concerns. The fact that using a specific theme can open security issues server-side is worrying to me.
I want my server to serve files without having to worry about security vulnerabilities. That's why i use a SSG (zola).
I didn't even know what a wedding registry was until after the rename. It is named after https://fr.wikipedia.org/wiki/%C3%89mile_Zola
> I did this exact thing when I got frustrated with Hugo. I made my own custom SSG in order to create my blog. > The other thing that tends to happen with SSGs is that it can be a lot more fun to play around with the tech than actually writing blog posts!
Exactly that. A great way to learn a language too.
I wish I could remember the link, but there's a fantastic XKCD-style cartoon making fun of over-engineered static site generator blogging setups.
When you build a static site, basically there's a 99% chance your only blog post is going to be "How I rebuilt this blog in [insert] static site generator."
Happy to see some Hugo ideas made it into Zola.
Edit: noticed you make Cobra too! Damn - I owe you like 1000 man hours of saved work.
In regards to Hugo, I enjoyed using it at first, I loved how fast it was, but I kept running into issues so I decided to make my own SSG.
I now have my own SSGs written in C#, Go, Node, Python, Ruby, and PHP. It's totally ridiculous, I know. Yak shaving and shiny to the nth degree.
That, and coming up with a good design for the page.
Seeing all those HN posts about new static website generators and then your post makes me think that the important thing here is the concept of it, rather than specific implementations. I kind of like the multitude of options because it tells me that there's demand for that stuff, and we're all trying to find the most elegant solutions.
As a webdev, I'm happy to admit I'm not a programmer. I just dump some data in HTML templates, sprinkle some CSS and JS, while trying to give devs, editors, and users the tools to manage/navigate a website without much pain and suffering.
What I like:
* Already supports the tooling I enjoy → SCSS out of the box, django/jade-like template engine (Terra, its sister project), markdown w/ TOML frontmatter
* Fast → build times are almost instant, dev server builds to memory and does live-reload
* Gets out of your way → it doesn't do more than it can, yet provides enough to work
* Builds a search index for client-side searching if needed
* Single Binary → I can pass the executable around with the repo and installation and environments are not an issue (ruby and python are painful for part-time developers it seems, at least with my non-developer academic peers).
I like that it provides a simple base to build on. I have one site that uses webpack to generate bundles for a couple JS files to allow for modern JS (babel) → all I have to use webpack for is JS, Zola handles the rest.I migrated our Django theme for our previous site in an afternoon. I've found that those I work with often don't really understand how formatting in a CMS will apply in the published result, and often have to go back in and edit their pages for conformance → If I have to touch it anyway, I'd rather do it in markdown myself, something I enjoy using.
I have students/interns who have picked up markdown faster than any other markup or CMS. I've tried mezzanine [^meh] and wagtail [^excellent, but heavy for our brochure-ware] in python, wordpress is a pain [^either too flexible, or not flexible enough, research interns don't easily see how complex theme interactions occur] and some others like cockpit [^neat but flexible to a fault, yet too rigid for how free-form folks want to interact with it]. Markdown is translatable, and usable in other tools: it's a great common denominator with a very low bar for entry. Students continue to use it after first interacting with it on these projects after they've left.
What I'm missing:
* a way to build from an API endpoint instead of markdown, i.e.: point to an endpoint to get the section list, build children as pages. Then I could use content from a postgrest instance, or build it from a list of remote markdown files... (no, I haven't really thought this through very well)
YMMV.Sounds like remote content[0] might work for that?
0: https://www.getzola.org/documentation/templates/overview/#re...
Again, maybe I haven’t thought about this enough yet.
That's also my experience with non-technical users.
> a way to build from an API endpoint instead of markdown
Well zola is not extensible in this regard. But it should be trivial to build a shell/python/rust script that exports your content to the format zola expects. Don't hesitate to post in the community forums if you need help with that.
In particular for the next release, we're currently talking about making paths/links more consistent across zola [1], reworking the translations/internationalization system [2], and improving the README. [3]
[1] https://github.com/getzola/zola/issues/977 [2] https://zola.discourse.group/t/rfc-internationalization-syst... [3] https://github.com/getzola/zola/pull/1373
It had features for image manipulation built in that I had to get from a meh plugin for jekyll. I ended up reworking one of the sites I wrote in Jekyll in Zola on the next update. It was an art portfolio site so I leaned on these features heavily. It ended up being a pretty quick weekend rework and made the code base much easier to work in.
It was almost trivial for me to add a social sharing image generator for my posts. [2] That's something I never thought my SSG would be able to do.
Definitely check it out if you're looking at static generators. Zola too, which is amazing in its own right.
Zola uses a similar template language called Tera that seems to be a lot safer.
As a keen NixOS user, I love the idea of configuring my site with nix and embedding nix exprs in markdown. However, I'm unsure whether the project is still active, or if the whole thing was more of an experiment. The repo[2] seems a little quiet, but the documentation is extensive and great considering! I wonder if the author just considers it complete? Curious to here experiences from anyone who has had a play.
[1]: https://styx-static.github.io/styx-site/ [2]: https://github.com/styx-static/styx/
It's similar to macros vs actual functions in something like C++. Sure, you could write everything in macros but why not use actual composition?
I'd love to move our site off of Wix - and have full control when needed and work offline before publishing pages - but inevitably you dive back into code or the guts of database queries once you leave these WYSIWYG tools.
Between Wix and Zola is an opportunity, in my opinion.
See e.g. https://www.sanity.io/ or https://www.contentful.com/
Though in terms of customization is rather lite. There is theme support with custom themes so i guess it is possible, it just looks like a baklava of webdev layers to me that i didn't want to bother with. Most themes do seem to provide a tiny bit of customization though.
I made a blog with it and so far the main limitation is that i don't feel there is much i have to write, not the software :-P.
I strongly agree. There's plenty of niche proprietary tools like that, however i don't know of a collaborative, free-software solution like that.
I haven't formally studied computer science nor programming, so it's very hard for me, but I wanted to build a set of tools that would eventually allow for what I call "block-stitching": a UI that mixes the data, its editor (form fields), and its destination template.
The idea is to be able to quickly build a web page using nestable components, and being able to export/import the structured data, in as many formats as possible.
But since I hardly ever interact with other devs, I might have missed similar projects which are mature enough already? (I just like to build my own crap, it's fun)
This is the way I firstly stumbled upon it as I was looking for a fast way to generate a fully static site with the advantages of a generator and none of the overheads...
It may be limited for certain use cases but I think it would be my first choice for editing a static site without JS
I didn’t use any existing theme though. I just added ~30 lines of HTML/template markup. No theme needed really, not for my purposes at least.
I'd say Gatsby or NextJS are more popular due to being written in JS. They can both produce zero JS websites.
- "I want my visitors to be able to view this static page without enabling JS" and
- "I already know React, I might as well just write this in TSX"
Eleventy would be quite a bit closer to Hugo/Zola, but even then you'd have to use npm/npx to install and run it.
I have also looked at Hugo, which is determined to uphold evil and suffering by using Go's horrible templating minilanguage; Nanoc, which is cool but at times inscrutable and perhaps a little too obscure; now I'm playing with Jekyll. In short I am doing everything except actually writing.
Any specifics that stand out to you? I haven’t done a lot with templating, but when I was investigating Hugo a while back it seemed straightforward enough. But that was at a high level.
For me the most difficult thing about it is that it is another language grafted on top of Go, and it does not always do what you expect it to do.
The documentation is hard read and not always clear on how things are supposed to work.
For example:
- If I pass in a struct that contains a map of structs, how exactly can I access this data?
- How can I use the boolean output of a function within an if statement?
- How do the if statements even work? "eq"? "=="? What is the correct syntax here?
I ended up losing a lot of time having of to wrestle with the templating engine because it often would not behave the way I expected it to.
Ah, I see. At my first glance I thought it was just normal Go syntax. I’ll have to look into this more, thanks!
What else did you try before landing on Gatsby?
I like only having to worry about a single language stack, and I can use typescript with Gatsby which negates some of my misgivings with js. Plus I can use react paradigms everywhere which is nice.
If you write React components in a way that leaves them functioning when statically rendered, I think it is relatively straightforward to roll your own generator that calls React’s built-in renderToString() on top-level app component during HTML generation, and bundles basic JS that does hydrate() in case user agent happens to have JS enabled (those two methods do a lot of the heavy-lifting). Devil’s in the details, of course, but have been low-key looking into that lately.
Hello, i would say there's a few missing template features in Zola (especially hashmap literals/functions) but i don't find it scarce. Could you elaborate with your painpoints so they can be addressed for others as well?
Zola is constantly evolving for the better, and the community forums are also a good place to exchange feedback/criticism
If i may, what's your usecase?
As mentioned, it is _extremely_ similar to Jinja2 in Python, a good number of Jinja2 templates should be valid Tera and vice-versa.
But I also want multi-lingual articles and article revisions so maybe Zola is not for me.
I absolutely love it how lightning fast it is, though, and I am sad that I still couldn't bring myself to learn it. These days my bandwidth (and desire) to invest fully in a new tool is at minimal values. :(
I think Zola would get much more traction if it had several typical cases covered in the tutorials: not only blogs but simple company pages, semi-informal technical docs, and the like.
Can somebody recommend something as fast as Zola but with more features -- or just it being much easier to learn? And don't say Hugo; it is really easy to start with but the moment you get off the beaten path you are looking at days of effort to modify your site.
I strongly agree. I started some of that with my theme https://tildegit.org/southerntofu/zola-water and i'd be pleased to cooperate on "standard" conventions across themes so we can swap themes easily without having to reconfigure/reorganize everything.
> But I also want multi-lingual articles and article revisions so maybe Zola is not for me.
zola supports translations, though the details of that are being reworked. Revisions are not supported so far, but is technically possible by building your site in a specific output folder for every commit (or something along those lines).
Linking across revisions, as it is not supported by zola would require either an external component (eg. in an iframe) or a build script that rewrites output pages to be aware of their revisions. Though implementing a simple git interface to zola to expose commit names involving a specific page would not be hard (managing the different revisions as single pages, like is done for translations, would be more complex).
> I think Zola would get much more traction if it had several typical cases covered in the tutorials
Agreed. There is definitely a lot to improve on the website/documentation. If you have a more detailed proposal and/or would like to get involved, feel free to talk about it in the community forums https://zola.discourse.group/
> Linking across revisions, as it is not supported by zola would require either an external component (eg. in an iframe) or a build script that rewrites output pages to be aware of their revisions.
Ah, I mean something much simpler than that. Imagine having a combo box at the top of the article, named "Versions" (or "Revisions") that has the value of "latest (2020-02-28)" at the top and currently selected and then has all others just as dates below. When you choose one, the page loads another HTML file. Extremely simple vanilla JS, likely 5-10 lines.
Or you can just have a limited list (say the last 5 revisions) with direct links -- again before the content starts. Clicking those would not even need any JS at all. It would be a plain old <a href="/blog/whatever-article/rev/2020-01-31.html">2020-01-31</a> markup.
And if an article has no revisions (only has been written once) then the needs for such a combo-box or list of links disappears and they should just not be rendered at the article's page at all.
That is correct, and it would be sad and damaging to believe exhausted volunteer maintainers should satisfy each and every desire of yours. However, stating expectations and desires respectfully is really helpful, especially when it is done in a precise manner so someone with time and energy can try to implement it.
> When you choose one, the page loads another HTML file.
Well if you're keeping different versions of the Markdown file within your content folder, then it's not a problem. A page can link to its siblings just like you described.
But zola, like all SSGs i know, uses a simple folder for content so there is no notion of history of a single file. We usually use a version control system (like git) for that.
That's precisely why I am keeping silent. I worked on OSS myself and I don't want to come off as entitled. When I don't find the features that I would like I am mostly just shrugging and thinking to myself "either I'll research Zola's code base and make a good PR about it or I'll just keep my thoughts for myself because everyone can demand their own favorite features and it's not a productive use of the maintainers' time to read people's wishlists".
> However, stating expectations and desires respectfully is really helpful, especially when it is done in a precise manner so someone with time and energy can try to implement it.
True to an extent but I've been bitten by this in the past. My definition of respectful expectations is somebody's idea of entitlement even if I use language like "please consider this feature if you find yourself with some extra bandwidth in the future" and "I think this would help adoption because I know I am not the only one wanting it" and "this could help with SEO for this or that class of websites".
I learned that many OSS maintainers are tired and jaded -- and thus very jumpy as a result. So I just stopped giving suggestions after I have been slapped with "only PRs are welcome, otherwise we are not interested in theoretical discussions" several times in the past.
I realize Zola's maintainers might not be like this but there's something else to consider as well: it's mentally very tiring to have to use extremely watered-down diplomatic language (almost to the point of begging) just so you don't get on somebody's bad side if they had a crappy day.
I've had people rage at me for saying something as simple as: "feature X would be very helpful for workflow Y, would you consider adding it during the next 6 months?" (I guess the trigger was the implication of a deadline imposed on somebody's hobby work but the reaction was violent enough that I lost my desire to apologize.) And so it goes.
> We usually use a version control system (like git) for that.
I don't know the specifics but wouldn't that require Zola's Rust code to be aware of the GIT history of the website itself? Sounds like 5 tons of complexity loaded on top of 10kg worth of software, so to speak -- but I might be wrong.
I'd personally go for something like this:
/articles/
/reasons-to-choose-rust-in-2021/
+ 2020-01-31.html
+ 2020-02-28.html
+ 2020-03-05.html
why-i-left-ruby.html
/resume/
+ 2019-01-17.html
+ 2020-03-15.html
^ The above describes only 3 articles, one of each has no revisions (why-i-left-ruby.html), one of them has two revisions (resume) and another has three (reasons-to-choose-rust-in-2021).However, I am just talking out of my a$$ and can't comment if this is easy to integrate or what complexity and repercussions would it have to the otherwise free-form directory/file structure that Zola encourages.
I am simply illustrating what I would be after.
(Author of Zola here)
I don't mind feature requests at all! The only thing I mind is people getting angry if I close a feature request as too niche or out of scope for Zola.
But for example, the big focus for the next version is better i18n support so feedback/opinions are very welcome: https://zola.discourse.group/t/rfc-internationalization-syst... but it is a big chunk of work so it will take some time.
For the revisions, I don't think it would work right now the way you want. I have thought about something similar before but couldn't figure out a satisfying way to do it (or even whether it was common enough for the work to be worth it).
Well, if you like the feature, go for it! It's your project. :)
Seriously said though -- I think this has a lot of future in terms of f.ex. tech docs or Wiki-like articles where you would want to revise your opinion / take on a hot topic a year later. Such a feature is a glaring omission from the SSG engines IMO.
I'd love to help but sadly I am wrestling with severely deteriorated health and just being productive at work and functional enough for my family life is draining 90% of my daily energy budget. So I'd lie if I said that I could help right now. So I prefer not to lie.
(I'll definitely check out the thread for i18n, thanks for linking it!)
> The only thing I mind is people getting angry if I close a feature request as too niche or out of scope for Zola.
That won't ever happen with me. I don't get angry. I realize what it is to be an OSS maintainer and I am not entitled. I'll shoot my idea and if it doesn't get accepted I'll just shrug it off.
Thank you for the encouraging words! They mean a lot. Keep up the good work. Zola is so far my favorite SSG engine, it's just that I can't muster the energy to learn it well and maybe help extend it. Here's hoping for the future.
For personal stuff, I use org mode. It’s more free form and provides just enough publishing features.
SSGs seems like popular bikeshedding matter.
Am I missing something? Org Mode is always so glorified yet it failed a pretty basic use case for me.
Most probably a plug-in bug.
Emacs, org and Babel are great to write “live” documents.
I love Emacs but after ~18 years with it it's basically a death by a thousand paper cuts. It gets tiring to always have to fight for some basic features. :(
Thanks to some investigative work from Doom Emacs people[3][4], I have found that my issue was fixed by simply installing the sql-indent package. Of course you would need to make sure these settings are set to true to enable tab acting according to native mode in source code blocks:
(setq org-src-tab-acts-natively t)
(setq org-src-preserve-indentation t)
(setq org-src-fontify-natively t)
And yes, I wasn't amused by this. I had another problem with shell mode indentation in org source blocks as well. That said, while the lack of cohesion due to decentralised nature of Emacs development occasionally surfaces like this, I think it would be unfair to not mention that org-mode when not buggy - which is more often than not - makes a lot of great features accessible. For instance, it automatically connects to Postgres, runs my query fragment, and populates an org-mode table (which are awesome) with the resulting output - I find this feature invaluable.Oh and if you are a Spacemacs user, perhaps give Doom Emacs a try.
[1] https://github.com/alex-hhh/emacs-sql-indent
[2] https://github.com/emacs-mirror/emacs/blob/master/etc/NEWS.2...
As for Doom Emacs, I am mentally way too fatigued by learning new tools almost every day. :(
I hear that it can be kind of like Spacemacs but it requires quite a bit more manual management which I am not a fan of. Do you have any experience confirming or refuting this impression of mine.
Very thankful for the links, I'm currently going through them.
https://www.spacemacs.org/doc/DOCUMENTATION.html#orgheadline...
I did try Doom Emacs though. I felt it was usable right out of the box with nice defaults. But then again I haven't used it for a serious time length (I prefer Emacs keybinding, rare I know).
I also empathise with tool fatigue. I haven't significantly touched my Emacs config in a while, been in strictly bug fixing mode. That does mean I shouldn't update major version of Emacs, or the packages, but I sometimes do that anyway :/
Last time I blindly updated Spacemacs itself I lost an hour getting it back to a workable state, sigh. Learned my lesson since then. I do both: (a) completely back up my ~/.emacs.d to another directory and (b) write down the last-known GIT commit hash of Spacemacs. Paid off huge dividends half the time I did updates ever since.
I love Emacs but it seems certain things won't ever get resolved (like macOS slow rendering although that's like 70% attributed to huge fonts with a lot of emojis in them so I got that part sorted at least).
Again, thanks for the support -- much appreciated! I'll go through the links plus will try to resolve my Org Mode problem in particular -- eventually.
You're right that it's not mentioned, but Zola is written in Rust. Perhaps others already knew of this?
Super fast. Simple for most usecases. Integrated feed support (Atom). Good-enough translations system. These points may be true for other SSGs as well, but they're personally why i ended up using zola.
It's just a really fun project to work on, quite easy to get something working and the result, even if it sucks, is almost immediately useful for anyone who needs a SSG. It may suck but you know exactly how it works.
Some of us get too excited and actually end up making something other people also want to use.
On the flip side, we run a custom cms with hugo as the SSG on a much larger site and it builds and deploys in under a minute.
WP has it's uses, but speedy sites are not a focus.
- local-first CMS with a strong emphasis on folders/files - multiple DVCS integrations (git, mercurial, pijul) with commit signatures (PGP) - support for forge APIs and email-based workflow to simplify the cooperative PR/MR/patch process - strong translations support, to see at a glance missing/outdated translations
There's been some work in this area, but netlify is really complex and is not meant to be selfhosted. And in any case these CMS overlays for SSGs end up making their own conventions that SSGs then have to comply with. It would be interesting to see an alternative approach where a CMS-as-a-library can be adapted to support any kind of SSG.
Some complicated stuff to deal with when building a content editor for SSGs:
- internal and relative links don't have the same semantics across SSGs, and don't point to the same place depending on the webroot - content may contain macros/shortcodes, the local editor needs to be aware of that in order to produce meaningful output - taxonomies and parenthood relationships also vary greatly from one implementation to another
Statamic sort of fits in this discussion. It's a flat file cms that is by default deployed similarly to wp, but it has 2 distinct use cases that separate it a bit.
1. you can use their ssg module to do ssg things and just use their cms as, well, the cms. you can do this locally and just push the output to your favorite web server.
2. if you are familiar with laravel development, you can drop it in an existing laravel application with minimal effort.
Next.js is wonderful, but I've had a crazy amount of pain because `<Image>` can't be used if you want to export to purely static (which I strongly prefer), and other options seem to have died (if anybody has one they use or maintain, please let me know!!). I've ended up rolling my own solution in bash that uses Squoosh to crank out set sizes and the like, but it's gross and not useful for others that aren't me, which is a problem when I have to collaborate.
Anyway, thanks for the project!
It's great to see that they're looking to support next-generation image formats. They're not in Hugo, as a requirement seems to be that dependencies are all fully written in Go, no use of bindings. It's a sensible decision from a maintenance perspective, but still unfortunate.
What Hugo does have, and for which I couldn't find an alternative for in Zola, is something akin to `esbuild` that can build and bundle JavaScript and TypeScript. Is there some way to do this with Zola or does one need to setup a separate build step for that with e.g. `swc`?
Not right no. My issue with that is usually people that want a JS build system will want webpack, loaders and other JS dependencies to also work. You end up just executing webpack command from the SSG while the user could just run it themselves, without a layer.
Probably not to everyone's tastes though :D
pip install --user mkdocs
cd your-markdown-directory/../
echo 'site_name: mysite' > mkdocs.yml
ln -s your-markdown-directory docs
mkdocs build && mkdocs serve
# if you don't like the default theme:
mkdocs build -t readthedocs && mkdocs serve
No you do not need add special meta info into your markdown files, any regular markdown files will work just fine.There's also a concern for maintenance: maintaining the zola codebase to support more serialization formats is more work. If more contributors get involved regularly, it will be less of a problem.
In fact, zola started supporting YAML frontmatter for compatibility reasons lately, but it's explicitly stated in the docs this is not the recommended/supported way to do things.
There are a lot of homonyms with English and Chinese that you won't get from typical dictionary searches because even the romanized spelling is completely different.
OK,cool, let's read the documentation.OK , first example, clone this template and blah blah. The template is always like 4 versions behind (the same for 90% of the templates that can be downloaded). Even doing the most simple change it is a pain,it almost feels black-boxy. At that moment I gave up and go back to simple JS/CSS with React if needed.
Among that lot the one which seems the sanest is Next and even then it is too opinionated for my taste.
It's mind bogglingly robust and manageable.
I've tried several "simple CMS" packages. This is way better.