{"id":36996232,"url":"https://github.com/wrey75/johannes","last_synced_at":"2026-01-13T23:48:35.146Z","repository":{"id":57082470,"uuid":"71126567","full_name":"wrey75/johannes","owner":"wrey75","description":"A CMS rendering system based on Mustache","archived":false,"fork":false,"pushed_at":"2019-07-11T23:43:18.000Z","size":69,"stargazers_count":0,"open_issues_count":9,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-26T01:46:48.940Z","etag":null,"topics":["cms","cms-framework","mustache","php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wrey75.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-10-17T10:27:24.000Z","updated_at":"2018-04-03T19:35:42.000Z","dependencies_parsed_at":"2022-08-24T14:58:20.891Z","dependency_job_id":null,"html_url":"https://github.com/wrey75/johannes","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/wrey75/johannes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wrey75%2Fjohannes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wrey75%2Fjohannes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wrey75%2Fjohannes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wrey75%2Fjohannes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wrey75","download_url":"https://codeload.github.com/wrey75/johannes/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wrey75%2Fjohannes/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28405431,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T21:51:37.118Z","status":"ssl_error","status_checked_at":"2026-01-13T21:45:14.585Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cms","cms-framework","mustache","php"],"created_at":"2026-01-13T23:48:35.085Z","updated_at":"2026-01-13T23:48:35.137Z","avatar_url":"https://github.com/wrey75.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# johannes\n\n\u003e THIS PACKAGE IS NOW ABANDONNED. A REPLACEMENT HAS BEEN MADE SUCCESSFULLY BUT\n\u003e NOT YET PACKAGED. THE NEW SYSTEM ALLOWS JSON GENERATION AND SOME OTHER FEATURES\n\u003e LIKE WIDGETS AND PLUG-INS. FOR THE MOMENT, THIS NEW PACKAGE NOT YET NAMES IS\n\u003e IN PRODUCTION ON MY WEBSITE BUT I HAD NO TIME TO CREATE A SUITABLE PACKAGE.\n\n*johannes* is a new CMS based on some ideas provided by Wordpress. But quite different. Written in PHP but\nit is conceived to be agnostic and mustache-centric. It means that the system is driven by templates\nwritten in Mustache.\n\nProduct in development. This project is NOT for production. If you want to help, free to you. If you\nneed help, please open an issue.\n\n## Why johannes?\n\nThe name is based on the first name of [Gutenberg](https://en.wikipedia.org/wiki/Johannes_Gutenberg),\nthe inventor of the modern printing. Usually I do not try to waste time on findinng names for my projects.\n\n## Why PHP? Why Mustache? Why not Wordpress?\n\nBecause, my main projects are in PHP. That's why, I decided to use this language. But, basically,\nI admit nodeJS or other language are quite good to develop such system. PHP is well suitable for\ninstallation everywhere including very small servers.\n\nThe usage of [Mustache](https://mustache.github.io/) is to protect the system of the\nXSS injection. Basically, everything is HTML escaped when you use the PHP mustache engine.\nThis is a very good security for PHP programmers. From the beginning, PHP is outputting\nplain HTML. If you have bad data in the database, you can inject scripts directly on your page.\nThis can be very dangerous. On the other hand, HTML can be easily printed with the triple\nbracket. That's a technical big advantage.\n\nMustache has a big advantage over all the other systems: it is agnostic but providing\nall I need to render a page. That's fine. The fact the template exists in many other\nlanguages like Javascript, Java, Ruby and many others is a good insurance to move from\nPHP to another language with a limited number of changes in the renderer. \n\nWordpress is very good to create blogs and other stuff. You can do everything you want \nwith a good facility but the plugins and themes rely too much on programming. I mean,\nwe use everytime PHP calls with high risks to have piracy. If you use themes and already\ndone templates (including plugins), you could be blocked at some point. You take the risk \nto use old stuff. Even on paid templates, you can find missing translations (I work in French\nmainly).\n\nHaving a basic renderer using templates and quite fast is a good way to start a website.\nThe power of administrating users is delegated to another project (not an open source, sorry).\nThen the main usage of Johannes is to render pages quickly and with minimum coding. Reducing the\ncode of my pages to the minimum. \n\nWordpress relies on MySQL (or MariaDB) and I love programming in MongoDB. That's why Wordpress\nwas not my main choice. But I have respect for this product because it's just amazing to see\nthe power of this CMS.\n\n# How it works?\n\nAs for WordPress, the project relies on themes (stored in a dedicated repository called\n\"themes\"), and plugins (you will find them in the directory \"plugins\"). Then, you\ncan add or change themes easily.\n\nUsing a theme, you rely on templates to render the page. Then, as for Wordpress, you can have\ndifferent templates. Wordpress relies mainly on a limited number of pages (blogs, normal pages,\narchives...). Same on Johannes. We use templating with some rules.\n\nMustache is the driver for rendering pages. This is the main difference between WordPress\nand Johannes. Wordpress is relying on pure PHP rendering. That's a very good idea but writing\nthemes is more complicated. Writing themes for Johannes should be kept very simple.\n\nNote the code for running Johannes is very light. You just have to create a PHP page and adding\nthis stuff:\n\n```php\n\n//\n// In a dedicated init.php file\n//\n\n$cms = new Johannes\\CMSEngine(); // Create the engine\n$cms-\u003einit();  // init the engine\n$cms-\u003esetTheme(\"brave\"); // select the theme\n\n$cms-\u003euseTemplate( \"basic\" ); // The basic page\n$cms-\u003esetTitle( _(\"Welcome\") ); // Set title...\n \t\n$cms-\u003epush(\"app\", $app ); // Add data (can be instances of classes, anonymous functions or arrays)\n$cms-\u003erun(); // render the page\n\n```\n\n# The database\n\nThat is another point: WordPress relies on MySQL only to store its information.\nJohannes doesn't rely on a database. Everything is file-related. But, of course,\nyou can use any database if needed because the code is not on the CMS side (in\nthe first version at least).\n\nDue to Mustache, everything is really JSON-oriented. It means a MongoDB database is\nreally the best choice. But redis or simply JSON written files are also a possibility.\n\nThe fact the database is NOT part of the CMS is based on the fact this CMS has been\nwritten to render the pages of the [office240.com](https://www.office240.com) website.\nThis website relies on API calls and on business-oriented classes (rather than the\nclassic databases requests). Then evrything is data-realted and we can inject the\ncode directly.\n\n# Dependencies\n\nWe tried to limit the dependencies with other project. But we intensively rely on\nthe [Concerto](https://github.com/wrey75/concerto) project which is already in\nproduction for another website (having about 1000 visits per day). And, of course,\non the Mustache PHP project.\n\n# Frequently Asked Questions\n \nWhen I try a new product, I have several questions. Here my answers.\n\n## Is it working?\n\nYes. The project is _already_ in production on office240.com, then you can use it.\nAnd we think to develop it.\n\n## Is it complicated to configure\n\nNot really. You just have to specify the `ROOT` directory dedicated to Johannes\n(to store the themes, the templates, the plugins). By default, it is based\non `$DOCUMENT_ROOT/cms` where `$DOCUMENT_ROOT` is the root of your pages.\n\nNOTE: you must store the files inside the visible part of your website to ensure\na correct access for assets (CSS, javascript and images files).\n   \n\n\n \n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwrey75%2Fjohannes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwrey75%2Fjohannes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwrey75%2Fjohannes/lists"}