Hi from Edoardo (or, as some of you may remember me, “NoWhereMan”).
A few years ago, Samy, Drudo and I were all users of a self-hostable blogging platform called “SimplePHPBlog”.
SPB was actually simple: it was really easy to hack and customize; and because it did not need a MySQL instance to install, it would work pretty much anywhere. Thus, it quickly gained a small community of affectionate users that would extend it, modify it, and share their version with others; in true open source fashion.
Samy, Drudo and I met on Drudo’s forum for the tiny SPB Italian community. In 2006, PHP was not the sexiest of the programming languages, but it was ubiquitous; most free web hosting would provide an Apache server with an (often stripped-down) PHP environment: in most cases you wouldn’t even have access to a proper database backend.
SPB was great because it stored everything to plain-text files. However, every time SPB released a new version, you would lose all your changes; because SPB was simple to hack on, but it was not designed with an extension system in mind.
We decided to design our own version of SPB, where the storage format would be kept the same, but the engine would be completely rewritten from scratch. We borrowed from WordPress its plugin system, so that people could easily port some of the existing plugins.
And because of the “flat-file” data storage, we decided to call it “FlatPress”.
Later, we found FlatPress in many surprising places: people would not just use it for blogs, but also for magazines and all other sorts of publications. When today I meet a FlatPress instance in the wild, it still brings a smile to my face.
I don’t think any of us would have expected that 20 years later, the open source project the three of us started in 2006 would still be around.
At 20 years old, FlatPress was my first real foray into open source as a maintainer and not just as a user. 20 years later, my job at Red Hat might have changed shape, but it’s still eminently devoted to open source.
In a way, FlatPress’ 20th anniversary coincides with my own. So here’s to you, FlatPress: the little flat-file CMS that could.
The Mastodon plugin as a Fediverse bridge | AI-generated with DALL-E
In my ongoing development work, I focused on the response time of FlatPress 1.5 Stringendo with several thousand posts and comments. FlatPress currently has a concrete Fediverse bridge via the Mastodon plugin. Despite its extensive feature set, the FlatPress project does not compromise its core principles for Mastodon integration. From an architectural standpoint, this is a major advantage. FlatPress remains true to its own guiding principle: a simple, easy-to-install blogging engine that works with files rather than a database.
The Mastodon integration is implemented as a plugin rather than as built-in logic in the core. I’m currently still working on the final details. The main challenge lies less in missing features and more in FlatPress’s request-based operating model. In its current form, FlatPress has no true background service and no worker process that runs continuously. The Mastodon plugin’s automatic synchronization depends on regular web requests. It is clear from the plugin’s code: the automatic run is triggered only by regular requests, not by POST requests and not by CLI execution. If no one visits the page after the scheduled time, nothing happens initially; synchronization is postponed until the next appropriate page visit.
For small to medium-sized blogs, this is a pragmatic approach. However, for deeper federation or rapidly increasing communication loads, it presents a significant bottleneck. Every communication with Mastodon, every media upload, every import of a reply thread, and every additional file access consumes time within the same PHP request, which is also supposed to deliver a page at the same time. On fast systems, this may go unnoticed. On shared hosting, slow storage devices, or with unstable external connectivity, however, render and response times can suffer significantly or hit timeout limits.
This is precisely where Stringendo’s focus on performance aligns well with the challenges at hand. As FlatPress interacts more extensively with external services today, fast response times, robust file operations, local caching, and efficient I/O are no longer luxuries but essential requirements. The codebase already shows that I have invested precisely in these areas. Nevertheless, the fundamental limitation remains: as long as background processing is coupled with normal requests, it shares resources with the actual page delivery.
For crawlers, monitoring systems, or AI bots, it likely doesn’t matter whether FlatPress delivers a page in 200 milliseconds or in significantly longer. From FlatPress’s perspective, however, it is precisely such a regular GET request that can trigger the required synchronization process. We already use this in the newsletter plugin to send out the monthly newsletter. As long as complex external communication must take place within normal web requests, there will always be limitations regarding load, response time, and background processing. For personal and medium-sized self-hosted blogs, the current approach is nevertheless very practical. For broader, universal IndieWeb support, additional protocols and background processing decoupled from page requests would be necessary in the long term. However, I fear that FlatPress is not suitable for universal IndieWeb support.
We just published a bugfix release for FlatPress 1.5 “Stringendo”.
It fixes a nasty bug in the PrettyURLs plugin that occured with some fresh installations. Also, we fixed a little bug in the BBCode plugin.
Thank you all for reporting!
If you have a fresh installation of FlatPress 1.5 “Stringendo”, we strongly recommend to update.
In any other case, it’s not really neccessary.
Where to download?
Please see the release information on GitHub to find the detailed change log, a full download package, also update packages from FlatPress 1.3, 1.4 and 1.5:
Image: ‘Happy 20th Birthday, Rebecca Randall!’ by wickenden - licensed under CC BY-SA 2.0
Crazy how time flies: The FlatPress project is around for a solid 20 years!
What Edoardo Vacchi a.k.a. the NoWhereMan started with great dedication in 2006, has grown into a global community over the years. You helped testing new versions, contributed many themes and plugins, reported bugs and security issues, helped and supported each other. With all your efforts, you have impressively demonstrated that flat-file blogging - which has been declared dead time and again - has never lost its relevance. Quite the contrary: As a key feature of a free web, individual blogs, unfragmented by profit-driven algorithms, are more important than ever.
Thank you for your year-long support, all you folks out there! In a way, FlatPress is built with all of our hearts and souls.
(Feeling nostalgic? Check out the history of the project in Edoardo’s and Arvid’s congratulatory messages for the project’s 15th anniversary in 2021!)
New release: FlatPress 1.5 “Stringendo”
Image: ‘New York Relays - Track and Field - Motion Blur’ by Steven Pisano - licensed under CC BY 2.0
Celebrating the 20th anniversary of FlatPress, we present you with the new release FlatPress 1.5 “Stringendo”.
In musical terms, “stringendo” stands for playing gradually faster, thus accelerating the tempo. This is exactly what FlatPress 1.5 does :)
What’s new?
Thanks to clever caching methods and some tweaks here and there, FlatPress is faster than ever - especially with huge numbers of entries and comments. Stringendo, baby! (If you’d like to test the new performance yourself, start your own stress test with the FlatPress Burnout Benchmark!)
With an updated Smarty template engine, FlatPress now supports PHP up to 8.5.
Finally, FlatPress has a multi-file uploader, and the widget panel has been reworked.
SEO of the PrettyURLs plugin has been improved.
Basque translation was added.
We fixed quite a lot of bugs and possible security issues (thanks to all the reporters!).
Don’t forget to check out the fresh new “Stringendo” style of the Leggero theme!
FlatPress 1.5 “Stringendo” contains many other improvements, bugfixes and security fixes.
Where to download?
Please see the release information on GitHub to find the detailed change log, a full download package, also update packages from FlatPress 1.3 and 1.4:
Fraenkiman created the cool new Mastodon plugin that integrates FlatPress with the Fediverse. We hope this fits your needs and wishes - please give it a try and let us know on the Support Forum!
Happy blogging, everybody - and thank you so much for all the joy of the 20 years within this great little open source project!
In May 2024, we provided you with some ideas on how to protect your FlatPress blog from being consumed by AI web crawlers. One is to add so-called “Canary GUIDs” to your HTML header: Each AI has such unique strings that distinguish content as benchmark data that should not be added to the AI training corpora.