![Logo](https://raw.githubusercontent.com/danpros/htmly/master/system/resources/images/logo-big.png) HTMLy is an open source databaseless blogging platform prioritizes simplicity and speed written in PHP. It uses a unique algorithm to find or list any content based on date, type, category, tag, or author, and it's performance remain fast even if we have ten thousand of posts and hundreds of tags. Demo ---- Visit HTMLy demo as blog. Requirements ------------ HTMLy requires PHP 5.3 or greater, PHP-XML package, PHP-INTL package, and PHP-ZIP package for backup feature. Installations ------------- Install HTMLy using the source code: 1. Download the latest version from the [Github repo](https://github.com/danpros/htmly/releases/latest) 2. Upload and extract the zip file to your web server. You can upload it in the root directory, or in subdirectory such as `htmly`. 3. Visit your domain. If you extract it in root directory visit `https://www.example.com/install.php` and if in subdirectory visit `https://www.example.com/htmly/install.php`. 4. Follow the installer to install HTMLy. 5. The installer will try to delete itself. Please delete the installer manually if the `install.php` still exist. ### Online install Install HTMLy without downloading the source code and use the online installer: 1. Download `online-installer.php` from the [latest release](https://github.com/danpros/htmly/releases/latest) 2. If you upload it in root directory visit `https://www.example.com/online-installer.php` or if in subdirectory visit `https://www.example.com/subdirectory/online-installer.php`. 3. Follow the installer to install HTMLy. 4. Please delete the installer manually if the `online-installer.php` and `install.php` still exist. Configurations -------------- Set written permission for the `cache` and `content` directories. In addition, HTMLy support admin user role. To do so, simply add the following line to your choosen user: ````cfg role = admin ```` Users assigned with the admin role can edit/delete all users posts. To access the admin panel, add `/login` to the end of your site's URL. e.g. `www.yoursite.com/login` Content Structure ---------------------- If you are using the dashboard to write your blog post then the following information is just knowledge about the HTMLy folder and filename structure. Like traditional static pages, even though HTMLy is a dynamic PHP application, most important metadata such as username, category, type, tags, publication date, and slug are in the folder name and filename. Example: ``` content/my-username/blog/my-category/post/2024-01-10-25-35-45_tag1,tag2_my-post-slug.md ``` Here's the explanation: * `my-username` is the username. * `my-category` is the content category. * `post` is the content type. Available content type `post`, `video`, `audio`, `link`, `quote`. * `2024-01-10-25-35-45` is the published date. The date format is `Y-m-d-H-i-s` * `tag1,tag2` are the tags, separated by commas * `my-post-slug` is the URL With a structure like above, the post can now be visited even though it's just a folder structure and filename. To claim this content and be able to edit or log in to admin, simply create `my-username.ini` in the `config/users/` folder (see `username.ini.example`). And to add information about the author, create `author.md` in `content/my-username/`, example: ```html Just another HTMLy user ``` Information about `my-category` can be added by creating `my-category.md` inside the `content/data/category/` folder. ```html This is my category info etc. ``` **Note:** The default category is `Uncategorized` with slug `uncategorized` and you do not need to creating it inside `content/data/category/` folder. **Important:** Every time new content added (post, category etc.), or you make changes that change the folder structure or file names, simply delete the `index` folder inside `cache` folder so that the changes detected by HTMLy. **Post Views Limitations:** HTMLy using the filename path as the ID for the post/page views counter. So if you edit an post/page without using the dahsboard which results in changes to the folder structure or filename, then you must edit `views.json` in the `content/data/` folder manually to update to correct path. Static pages ------------ For static pages, use the following format: ```` content/static/about.md ```` In the example above, the `about.md` creates the URL: `www.yourblog.com/about` Thus, if you write/create files offline, you must name the .md file in the format above. For static subpages, use the following format: ```` content/static/about/me.md ```` This will create the URL: `www.yourblog.com/about/me` Content Tags ------------- If you are writing offline, you need specify the content tags below: **Title** ```html ```` **Meta description** ```html ```` **Tags** This is just the tags display and for the slug is in the filename. ```html ```` **Featured image** Post with featured image. ```html ```` **Featured youtube video** Post with featured youtube video. ```html ```` **Featured soundcloud audio** Post with featured soundcloud audio. ```html ```` **Featured link** Post with featured link. ```html ```` **Featured quote** Post with featured quote. ```html ```` **Example** Example of how your post would look like: ```html Paragraph 1 Paragraph 2 etc. ``` ### Lighttpd The following is an example configuration for lighttpd: ````php $HTTP["url"] =~ "^/config" { url.access-deny = ( "" ) } $HTTP["url"] =~ "^/system/includes" { url.access-deny = ( "" ) } $HTTP["url"] =~ "^/system/admin/views" { url.access-deny = ( "" ) } url.rewrite-once = ( "^/(themes|system|vendor)/(.*)" => "$0", "^/(.*\.php)" => "$0", # Everything else is handles by htmly "^/(.*)$" => "/index.php/$1" ) ```` ### Nginx The following is a basic configuration for Nginx: ````nginx server { listen 80; server_name example.com www.example.com; root /usr/share/nginx/html; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log error; index index.php; location ~ /config/ { deny all; } location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } ```` Making a secure password ---------------------- Passwords can be stored in `username.ini` (where "username" is the user's username) in either plaintext, encryption algorithms supported by php `hash` or bcrypt (recommended). To generate a bcrypt encrypted password: ```` $ php -a > echo password_hash('desiredpassword', PASSWORD_BCRYPT); ```` This will produce a hash which is to be placed in the `password` field in `username.ini`. Ensure that the `encryption` field is set to `password_hash`. Contribute ---------- 1. Fork and edit 2. Submit pull request for consideration Contributors ---------- - [HTMLy Contributors](https://github.com/danpros/htmly/graphs/contributors) Copyright / License ------------------- For copyright notice please read [COPYRIGHT.txt](https://github.com/danpros/htmly/blob/master/COPYRIGHT.txt). HTMLy is licensed under the GNU General Public License Version 2.0 (or later).