How FolioPress works: one page, every language

The bird's-eye view

Most websites speak one language. The moment a business needs a second one, things get awkward: a translation plugin bolted on top, a second copy of the site to keep in sync, or a pricier plan just to say "Olá" next to "Hello".

FolioPress started from the opposite idea: a page isn't a page with translations attached - it is all of its languages at once. The title, the address, the menu, the tags, what Google sees: everything exists in every language you choose, from the first minute.

It all started with the wish to replace a custom-built CMS that had multiple languages bolted into it. After searching for alternatives I found out they all failed miserably in integrating multiple language content in a simple-to-use website builder.

This is a look behind the curtain: how the whole thing fits together, the trade-offs behind it, and the things that broke along the way.

A visit travels left to right. The control tower never sits in that path. It only builds, moves and looks after the sites.

A visit to a FolioPress site makes three hops. Cloudflare catches it near the visitor and filters out junk. A front door: Traefik, which also takes care of the HTTPS certificates - looks at the address and finds the right site. The site itself answers, either from a shared building, where many small sites live side by side, or from a house of its own when it gets busy. Off to the side, a control tower handles everything a visitor never sees: sign-ups, billing, web addresses, updates and health checks, with a small caretaker on each server that starts and stops the sites.

All of it is Python, in three layers I wrote: a web framework (pystarter, built on FastAPI), the content management system on top (foliopress), and the control tower (Forestry). Payments go through Polar, which acts as the seller of record, so European VAT is their headache rather than mine.

Still need help? Write to us from your site's admin (Support), or email support@foliopress.io.