Hello World!

Daniel Foerster
3 minute read
An anchovy fish, the emblem for the Anchovy static site generator

Somehow, after over a decade of working with HTML5 and CSS3, and after building site after site for open source and non-profit projects, I have finally put together a website for myself. (The one I slapped together in an hour using vim over SSH definitely doesn’t count!)

A multitude of blogging platforms and frameworks already fill the world. The same can be said for website platforms, website frameworks, and static site generators. So why a new framework for this site?

The answer, of course, is that none of them were quite what I wanted. Flask + Jinja2 is nice for sites with enough dynamic content to justify the hosting costs, but a personal website with a blog isn’t likely to cross that threshold, and will require building out some boilerplate anyways. I did encounter and appreciate Microbe, and even launched a blog using it, but that project never supported website functionality, did not offer a way to version control and preserve content, and was eventually left unmaintained.

My next blog platform was Medium, which offers complete functionality without demanding almost any sort of setup or maintenance, but requires a subscription to do much customization or even to use your own domain. An, of course, it is entirely impossible to build a website on the platform.

As building a personal website moved up my agenda, I determined that an SSG would be the best choice, both in cost and maintainability. But I knew I didn’t want to use something like Jekyll that would force me to completely abandon my comfort zone in the Python web ecosystem. Since I had worked on a non-profit project using Nikola, I felt comfortable enough with the framework— but after porting another open-source website I quickly realized I would be spending almost as much work stripping away the provided assumptions as I would save by using it.

Flashback to Blot. A Python SSG framework built by a friend, Blot captured my attention with its minimal assumptions and pipeline processing structure. But the author moved on to the React/Gatsby ecosystem before building much functionality or robustness into the system.

Back to the present, I started digging through lists of Python SSGs, and finally came across staticjinja. This framework was actually too minimal, but included an example application with markdown injected into Jinja templates. I decided to synthesize the inspirations of Blot and staticjinja to my own SSG framework, which I would engineer to soothe my inner perfectionist and satisfy my personal tastes with minimal assumptions and dependencies and maximum extensibility. Along the way, I settled on the name Anchovy, created a dependency reporting system, and hand-rolled my own CSS preprocessor, with the end result that this site requires very little custom code and zero non-Python dependencies. Best of all, DigitalOcean builds and deploys the site automatically when triggered from GitHub, so updates are painless enough to actually create, and I don’t have to carefully store or remember a credential for a random VPS.

So that’s the story of how this site came to be. Though I didn’t dive into too many technical details, I hope to walk through Anchovy and some of the engineering for d48.io specifically in further posts in the near future.