I'm happy to introduce our new ultra-low tech CMS for smol, accessible websites. The goal was to make something that could be self-hosted, but friendly enough for people who don't SFTP or use a terminal. 3 PHP files, Apache, and Gemtext. Should work on any dumb old Apache host; a technical person could manage many of these for friends and family with zero maintenance. Happy to answer any questions or take bug reports.

@winduptoy awesome work! it looks great and the video is super informative :tealheart:

@winduptoy This looks really great! Love the idea of using Gemtext for this.

Unrelated question: what does "low consumption website" in the footer refer to, specifically? No JS, low bandwidth, efficient code, or all of the above? Or something more specific?


Nice work!

Neat to see a simple middle ground tool like this emerge.

Is the intent to have the gemtext also available via Gemini?

@RussSharek Thanks!

Being available via Gemini is a huge bonus if you're technical enough to set that up. Most of the people I meet who need a website but have no technical skills just gravitate towards WordPress or Squarespace by default. The primary purpose was to lighten that load, reduce cost and cut the cruft. Reading Gemini is such a great experience, they just don't know it yet. 😉 Hopefully Lichen is the stepping stone they didn't know they needed.


Good logic.

Thank you for removing a little friction.

@winduptoy nice work! I like it doubles as a Gemini tool and it looks smaller than even Wonder CMS…

@winduptoy this looks really great, thank you for writing it.

@winduptoy this is a nice solution, well done! Years back I made something I called “Nimble Text” which worked similarly except with markdown and only for a block at a time, rather than whole page/site. There are a lot of UI details I’m seeing in your intro video that make this vastly superior, most especially the file browser. Looking forward to giving it a spin!

@winduptoy this looks so cool, definitely looking forward to trying it out :D

@winduptoy ha! I also coded my website that way. Only 1 php file for everything XD

@winduptoy This looks really nice, I’m not sure what I’d use it for yet, but it’s very inspiring. Great job!

@winduptoy Awesome little CMS ;) something to consider: if you replace all str_starts_with()/str_ends_with() with substr() in your gemtext.php/edit.php it would also work with PHP 7.x

@scops thank you! I will try to implement that. I've written very little PHP over the years so I'm still getting to grips with its rough edges.

@winduptoy i'm a fulltime/fullstack webdev with fokus on JS and PHP. If you have questions, i'm happy to help :)

@winduptoy good that someone made something like this. Otherwise, I would have to do it

@winduptoy I have been waiting for this! Super nice and simple layout.

from the video, it looks like the homepage was made using this and I saw a video embed. Was this done with gemtext, or do you have custom markup for that? If this was custom, this is like 100% what I've been looking for for a buddy of mine to make and maintain a website.

@milofultz Its 100% gemtext! If you check out the cms/gemtext.php file you'll see how it was done. Inserting a link that ends with .jpg, .png, .gif, etc. it uses an <img> tag, .mov, .mp4, .webm, etc. uses a <video> tag, and everything else uses an <a> tag.

@winduptoy oh sick! This looks easily extensible. Thank you for sharing your creation, super slick! Finally gives me a chance to understand php, too :)

@winduptoy Does this dynamic rendering or is the PHP used to produce static files?

@mhd dynamic. Check out the cms/gemtext.php file, its extremely simple.

@winduptoy Looks cool ! But I'll have to struggle with debian (php7) and nginx to make it work :'(

@winduptoy Urgh, I'm stuck on "There was an error rendering the page." while loading, no error php's side, any way to debug this ? I wish I understood what did the JS thing

@winduptoy oh yeah, ff debugger.

>XHR POST https://MYWEBSITE/cms/render.php/index.gmi
> State : 404 Not Found

Of course there is nothing there ! I struggle to understand what was intended there

@otyugh that's sending the request to /cms/render.php and setting the $_SERVER['PATH_INFO'] variable to /index.gmi. I know it looks weird, but it's valid for Apache. It's all very dependent on the .htaccess configuration (check the comments). I have no clue how to make that work with nginx but I'm sure it's possible. If you get it working I will include nginx instructions for others.

@winduptoy Oh, that's htaccess, it explains so much ! I look into it, I'll tell you ! And if I'm right, it also should work with php7 with the tinyest hack (but maybe I missed some hard parts).

@winduptoy Ookay. So I got it working, it wasn't htaccess related (I should now find an alternative), my config just didn't handled the path_info trick.
I followed this link to make it work :

To get lichen to work with php7 I just added two simplistic function "str_start_with" and "end_with"... Seriously, PHP, why T_T

@winduptoy Mhm, almost working anyway. I can edit and make new post, but can't visit them after. Is that still me having bugs or is it just still under dev ? It'd be sweet if it'd just generate static html pages out of the static pages, I think.

@winduptoy wonderful toy! I've been playing for a while, but when I try to edit any file I get a JS alert "there was an error rendering the page" any idea what im doing wrong? :(

@pabs can't help without seeing some clue from the browser console (check the network response to the POST) or server error log

@winduptoy sorry! I have not much idea if JavaScript. The first thing I noticed was i didn't put the files in the main dir. But now I'm getting this on console.

@pabs hmmm not sure. have you tried downloading the newest release from the website and replacing the PHP files under /cms ?

@winduptoy 🤦‍♂️ sorry! It was permissions! It works genially! Thanks for your help :)

@winduptoy I love that it is called lichen 💖 is there a deeper meaning behind the choice? Will have a look at the software later on, super inspiring

@winduptoy this looks amazing!

after my recent rST trauma, i have just one burning question: do you have any plans to enable different parsers, like, say, for Markdown? i don't mean "support Markdown", i mean "make it possible for others to add Markdown support".

@datn @winduptoy Looking at the file structure, it honestly looks like it already would be pretty easy to support markdown! Just get a PHP markdown parser and replace the Gemtext one. I'd have to play around with it to be sure, but I'd be surprised if it was too difficult 😃

@winduptoy Great idea!
Does it support folders so if you want a webpage with more than a handful of pages you can sort them a bit?

@Anke yes it reads the filesystem and lets you create and edit files at any depth. At the moment you can't create new folders via the UI, but I hope to remedy that one day soon.

@Anke like, today for instance! I just pushed a new build to the site. Changelog updated.

@winduptoy This looks pretty neat actually.
Not a fan of PHP but I guess it was actually made for something on this scale.
You still need to learn CSS though and in my experience users will always want very specific things that are very hard to achieve. Also the CSS here is one file, which is vastly better than the hell that is Wordpress.


@winduptoy This looks pretty neat! Does it support the generation of RSS/Atom feeds?

@winduptoy Poking at it, I can see that the answer is "no." Better question, then: could it?

Sign in to participate in the conversation

Revel in the marvels of the universe. We are a collective of forward-thinking individuals who strive to better ourselves and our surroundings through constant creation. We express ourselves through music, art, games, and writing. We also put great value in play. A warm welcome to any like-minded people who feel these ideals resonate with them.