Self-host WriteFreely
updated Sep 2026deployed by usprices checked · Jul 2026Install verified on Ubuntu 26.04 · Sep 2026 · how we test
We earn commissions when you shop through the links below. Full disclosure →
A minimalist, distraction-free blogging platform for one writer or a whole community. Blogs federate over ActivityPub, so readers on Mastodon and other Fediverse software can follow them.
Key facts
CategorySocial network (Fediverse)
LicenseAGPL-3.0
StackGo, SQLite, MySQL
Min RAM256 MB
Official imageyes
Measured idle RAM16 MB
Difficulty
What you need
- Any VPS with at least 256 MB of RAM
- A domain you control — most self-hosted setups need HTTPS in front of them
- Under an hour if you've used Docker before
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + USKamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + AsiaDigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + AsiaPaid link — we earn a commission if you shop through it.
Install
Run these commands on your server:
# WriteFreely — the project's container image on ghcr.io, SQLite, configured with a config.ini
# upstream docs don't document a Docker production path yet; this uses the image + the documented CLI (db init, keys generate, user create)
mkdir -p ~/writefreely/data && cd ~/writefreely
cat > config.ini <<'EOF'
[server]
port = 8080
bind = 0.0.0.0
keys_parent_dir = /data
[database]
type = sqlite3
filename = /data/writefreely.db
[app]
site_name = My WriteFreely
host = http://SERVER_IP:8080
single_user = false
open_registration = false
min_username_len = 3
federation = true
EOF
# the image runs as the unprivileged `daemon` user (uid 2)
sudo chown -R 2:2 data
IMG=ghcr.io/writefreely/writefreely:v0.17.1
docker run --rm -v ./config.ini:/go/config.ini:ro -v ./data:/data $IMG db init
docker run --rm -v ./config.ini:/go/config.ini:ro -v ./data:/data $IMG keys generate
ADMIN_PASS=$(openssl rand -hex 12) && echo "admin login: writer / $ADMIN_PASS"
docker run --rm -v ./config.ini:/go/config.ini:ro -v ./data:/data $IMG user create --admin writer:$ADMIN_PASS
docker run -d --name writefreely --restart unless-stopped -p 8080:8080 \
-v ./config.ini:/go/config.ini:ro -v ./data:/data $IMG
# open http://SERVER_IP:8080 and log in; set host to your https:// domain before federating (it can't change later)More self-hosted tools
Social network (Fediverse)
GoToSocial
GoSQLitePostgreSQL
easyRead guide →
Social network (Fediverse)
Lemmy
RustTypeScriptPostgreSQL
moderateRead guide →
Social network (Fediverse)
Mastodon
RubyRailsNode.jsPostgreSQLRedis
moderateRead guide →
Backup
restic
Go
easyRead guide →