Today I published Plume RC1, my side-project for a self-hosted, flat-file publishing platform built to simplify independent publishing
NOTE: Copy/pasted from r/php Hey r/selfhosted, longtime open source developer here. After about a year of work on a side-project I'm dropping the first release candidate of Plume , a self-hosted, Markdown-powered, flat-file publishing platform and I'd love this community's feedback. Read the release announcement or check out the demo and let me know what you think. What is Plume? Plume is a publishing (i.e. blogging) platform. It's designed to make writing and publishing frictionless. Your content is just files, plain Markdown in a flat-file structure without a database. You can write locally and upload via SFTP or keep everything in Git and sync automatically. It's Dockerized out of the box for easy set up. Full-text search (powered by YetiSearch ) is built in so there's no external service to wire up. Plume also includes details you'd expect like Shiki syntax highlighting, automatic light and dark modes and an auto-generated RSS feed. The stack Plume is written in PHP using Slim Framework + PHP-DI, tested with PHPUnit, statically analyzed with PHPStan, styled with PHP-CS-Fixer. The front end utilizes Alpine.js bundled with Vite. The architecture leans on Directory Lister , a project I've maintained for years. But why? I primarily developed Plume for my own use. I occasionally like writing short-form on Bluesky (or previously Twitter) but have been growing tired of handing my content to someone else's platform. And long-form writing came with too much friction, killing my motivation before ever actually getting published. With Plume, publishing is as simple as creating a file and writing. The AI caveat Most software ships with heavy AI involvement these days. However, Plume was developed in my spare time over the past year, initially without any AI assistance. I've only recently adopted AI, and only sparingly, mainly for debugging, tests and help with documentation. However, every line committed exists because I put it there with intention. I'm not claiming perfection but I know how and why everything works, which matters for the long-term maintenance of the project. Feedback wanted Despite being designed for my own use, Plume was intentionally built so it could be shared. So try it, break it and tell me what's missing. Ideas and questions can be posted on GitHub Discussions or Bluesky . For bugs open a GitHub Issue . Resources Plume is fully open sourced on GitHub with full documentation is available at docs.plume.pub . I'm going to start preparing dinner in a bit but will be checking in periodically, so feel free to ask me anything.