GoBlog Is an Open-source Free Blogging System written with Go

GoBlog Is an Open-source Free Blogging System written with Go

GoBlog is a fantastic and user-friendly blogging system that is written in the Go language. It is open source and free to use for anyone. One of the amazing features of GoBlog is that it uses a powerful SQLite database to store most of the data, such as posts, comments, webmentions, sessions, etc. The database is accessed using the Go library mattn/go-sqlite3, which ensures data is efficiently managed and accurately retrieved.

Every time you start GoBlog, it performs a detailed check to see if there are any schema migrations to be performed on the database. This ensures that your data is always up-to-date and that you can make the most out of the latest features available.

GoBlog is a unique blogging system that stores files with a filename that is the SHA-256 hash of the file. This is an amazing way of preventing data duplication and ensuring that all files are unique and easily accessible at any time. Additionally, the system is written in such a way that it is easy to use, even for those with limited technical knowledge. Whether you are an experienced blogger or just starting out, GoBlog is the perfect solution for you.

GoBlog is written by Jan-Lukas Else, a software developer from Germany.


  • Single user with multiple blogs
  • Publish, edit and delete Markdown posts using Micropub or the web-based editor
  • Editor with live preview
  • Drafts, private and unlisted posts
  • SQLite database for storing posts and data
  • Built-in full-text search
  • Micropub with media endpoint for uploads
  • Local storage for uploads or remote storage via FTP or BunnyCDN
  • Automatic image resizing and compression
  • Uploads possible via the web-based editor
  • Send and receive Webmentions
  • Webmention-based commenting
  • IndieAuth
  • Login with your own blog as an identity on the internet
  • Two-factor authentication
  • ActivityPub
  • Publish posts to the Fediverse (Mastodon etc.)
  • ActivityPub-based commenting
  • Web feeds
  • Multiple feed formats (.rss, .atom, .json, .min.rss, .min.atom, .min.json)
  • Feeds on any archive page
  • Sitemap
  • Automatic HTTPS using Let’s Encrypt
  • Tor Hidden Service
  • Tailscale integration for private blogs with HTTPS
  • Fast in-memory caching for even faster performance
  • Automatic asset minification of HTML, CSS and JavaScript
  • Statistics page with information about posts
  • Map page with a map of all posts with a location
  • Posts can have a gpx paramter to include and show a GPX track
  • Option to create post aliases for automatic redirects
  • Redirects using regular expressions
  • Hooks to execute custom commands on certain events
  • Short URLs with option for a separate short domain
  • Command to check for broken links
  • Command to export all posts to Markdown files

Administration paths

Most settings can be adjusted via the configuration. But to create new posts, log in or out, see notifications or check webmentions there are fixed (partly configurable) paths:

  • Login: /login
  • Logout: /logout
  • Notifications: /notifications
  • Webmentions: /webmention
  • Comments: /comment

Some paths are blog-relative, so they must be appended to the blog path:

  • Editor: /editor

How to install and run GoBlog

It’s recommended to install GoBlog using Docker (Compose). You can simply pull the latest image from ghcr.io/jlelse/goblog:latest (basic image) or ghcr.io/jlelse/goblog:tools (for when you want to use sqlite3, bash or curl in hook commands) when there are updates. Those images are tested and contain all necessary libraries and tools.

Create your config file (./config/config.yml) with inspiration from example-config.yml and create a new data directory (./data). For static files, you can also create a directory at ./static.

Then you can use Docker Compose to run GoBlog. Here’s an example docker-compose.yml file:

        container_name: goblog
        image: ghcr.io/jlelse/goblog:latest # or :tools
        restart: unless-stopped # auto restart the container
            - ./config:/app/config # Config directory
            - ./data:/app/data # Data directory, used for database, keys, uploads etc.
            - ./static:/app/static # Static directory, if you want to publish static files
            - TZ=Europe/Berlin # You timezone

If you don’t want to use a reverse proxy (like Caddy or nginx) you can also publish the ports directly from the GoBlog container. Remember to enable public https in the config, so GoBlog gets Let’s Encrypt certificates.

    container_name: goblog
        - 80:80
        - 443:443

Start the container:

docker-compose up -d

Update the container with a newer image:

docker-compose pull
docker-compose up -d


  • MIT license