selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

GitHub
blog logo

Self-host blog

v1.5.0

Lightweight self-hosted Facebook-style PHP blog

ReleaseOpen SourceGPL-3.0
Updated10 hours ago
LanguagePHP
Setup difficultyModerate
MobileResponsive
ThemeDark mode
Stars
307
Port
80 (HTTP web server)
Docker
m1k1o/blog
Install with Docker
Light theme screenshotDark theme screenshotLegacy theme screenshot (compatible with older browsers)

What is blog?

blog is a lightweight, single-user PHP blog that creates a Facebook-style feed where you can share rich text posts with photos, code highlighting, and link previews. It supports three visibility levels: public, friends-only, and private. The blog runs with zero configuration using SQLite, or can use MariaDB/MySQL or PostgreSQL for better performance. It includes dark mode, a legacy theme for older browsers, BBCode formatting, tag filtering, and multi-language support (English, German, Slovak, French, Czech, Bosnian, Spanish, Russian). Deployment options include Docker, Docker Compose (with optional external database), or manual installation on Apache 2.0+ with PHP 8.0+. The project is licensed under GPL-3.0.

Should you self-host blog?

blog scores 48/100 on selfhost.directory (how scoring works) and ranks #13 of 24 in Blogging. It has 307 GitHub stars.

It shipped 1 stable release in the past year. The latest, v1.5.0, came out on 23 October 2026.

Setup is moderate: expect some configuration beyond a single command. An official Docker image is available. It is GPL-3.0-licensed and written mostly in PHP.

Its closest alternative on selfhost.directory is Typecho (66/100, 12 456 stars). It scores higher overall, so compare the two before you pick. See blog vs Typecho side by side.

Features

  • BBCode formatting
  • Code Highlighting
  • Date range filtering
  • Extra post fields
  • Goal highlighting
  • Hidden posts
  • Image Upload
  • Link Previews
  • Location filtering
  • Multi-language Support
  • Post visibility controls
  • Reverse chronological sorting
  • Tag Filtering

blog README

How to install blog

Install blog with Docker

Docker

docker run -d -p 80:80 -v $PWD/data:/var/www/html/data m1k1o/blog:latest

Zero-configuration setup with SQLite

How to configure blog

  • BLOG_DB_NAMEblogDatabase name

    Database name

  • BLOG_FRIENDSFriends list with passwords (YAML multiline)

    Friends list with passwords (YAML multiline)

  • BLOG_LANGenLanguage code

    Language code

    values: en, de, sk, fr, cz, bs, es, ru

  • BLOG_MYSQL_HOSTMySQL/MariaDB host

    MySQL/MariaDB host

  • BLOG_MYSQL_PASSMySQL/MariaDB password

    MySQL/MariaDB password

  • BLOG_MYSQL_PORT3306MySQL/MariaDB port

    MySQL/MariaDB port

  • BLOG_MYSQL_USERMySQL/MariaDB username

    MySQL/MariaDB username

  • BLOG_NAMEMax MusermannAuthor name

    Author name

  • BLOG_NICKusernameAdmin username

    Admin username

  • BLOG_PASSpasswordAdmin password

    Admin password

  • BLOG_POSTGRES_HOSTPostgreSQL host

    PostgreSQL host

  • BLOG_POSTGRES_PASSPostgreSQL password

    PostgreSQL password

  • BLOG_POSTGRES_PORT5432PostgreSQL port

    PostgreSQL port

  • BLOG_POSTGRES_USERPostgreSQL username

    PostgreSQL username

  • BLOG_TITLEBlogBlog title

    Blog title

  • db_connectionsqliteDatabase connection type (sqlite, mysql, postgres)

    Database connection type (sqlite, mysql, postgres)

    values: sqlite, mysql, postgres

  • db_nameblogDatabase name

    Database name

  • force_logintrueForce login for all posts

    Force login for all posts

    values: true, false

  • langenLanguage code

    Language code

    values: en, de, sk, fr, cz, bs, es, ru

  • mysql_hostMySQL/MariaDB host

    MySQL/MariaDB host

  • mysql_passMySQL/MariaDB password

    MySQL/MariaDB password

  • mysql_port3306MySQL/MariaDB port

    MySQL/MariaDB port

  • mysql_userMySQL/MariaDB username

    MySQL/MariaDB username

  • nameMax MusermannAuthor name

    Author name

  • nickdemoAdmin username

    Admin username

  • passdemoAdmin password

    Admin password

  • postgres_hostPostgreSQL host

    PostgreSQL host

  • postgres_passPostgreSQL password

    PostgreSQL password

  • postgres_port5432PostgreSQL port

    PostgreSQL port

  • postgres_userPostgreSQL username

    PostgreSQL username

  • timezoneTimezone

    Timezone

    values: Any valid tz database timezone

  • titleBlogBlog title

    Blog title

  • TZEurope/ViennaTimezone

    Timezone

    values: Any valid tz database timezone

blog releases & version history

More in Blogging

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…