# WriteFreely: Markdown publishing with the federation switched on

> WriteFreely is an AGPL-3.0 licensed, Go-based minimalist publishing platform for writers, built on an auto-saving Markdown editor with ActivityPub federation to Plume and other compatible software, OAuth 2.0 onboarding, hashtags, pinned static pages, more than twenty languages with first-class right-to-left support, and pen-name privacy by default. It deploys as a single static binary with built-in SQLite or MySQL and MariaDB, offers a hosted path through Write.as, and released v0.17.2 in August 2026.

**writefreely/writefreely** — A clean, Markdown-based publishing platform made for writers. Write together and build a community.

- Repository: https://github.com/writefreely/writefreely
- Website: https://writefreely.org
- Stars: 5,259 · Forks: 400
- Language: Go
- License: AGPL-3.0
- Published: 2026-09-23 · Updated: 2026-09-23 · Language: en
- Canonical page: https://hysenlabs.com/projects/writefreely-writefreely

## A platform that gets out of the writer's way

WriteFreely is a clean, minimalist publishing platform made for writers, pitched across three uses, start a blog, share knowledge within your organization, or build a community around the shared act of writing. The writing half is a plain, auto-saving editor aimed at distraction-free work, and once published, the words sit front and center and easy to read, the design philosophy stated as subtraction rather than addition. Organization stays light, hashtags categorize articles, pinning a normal post turns it into a static page, drafts are first-class, and one account can publish to multiple blogs. The privacy posture is specific rather than atmospheric, minimal data collection, nothing publicized beyond what a writer consents to, and the ability to run several blogs as different pen names without the association becoming public, a rare feature aimed at people who write under more than one identity.

## ActivityPub as the community bridge

The connected-community feature is where WriteFreely separates from plain minimalist blogs, writing together publicly or privately, connecting with other communities whether they run WriteFreely, Plume, or other ActivityPub-powered software, the federation protocol letting readers on entirely different platforms follow and reply. The repository makes the commitment visible at the file level, activitypub.go with its own test file, database_activitypub.go for the persistence side, hostmeta.go and nodeinfo.go for the discovery metadata federation depends on, and even gopher.go, the pre-web protocol still served. Onboarding from existing platforms arrives through OAuth 2.0 support, so members can be brought in with accounts they already hold rather than fresh registrations. For an organization evaluating it, the question the federation answers is reach, a WriteFreely instance is not an island, its posts can travel to readers who never visited the site.

## One static binary, three databases by build tag

Deployment follows the Go tradition, a static binary on any platform and architecture Go supports, with SQLite built in for the zero-dependency start and MySQL or MariaDB as the external option. The database story is visible in the tree as a build-tag decision, database-sqlite.go and database-no-sqlite.go standing beside database-lib.go, and the Makefile's build target compiles with the tags netgo sqlite while build-no-sqlite produces the variant without it, the choice made at compile time rather than configuration time. Cross-building is scripted through xgo with targets for linux/amd64, windows, darwin on amd64 and arm64, and ARM6, the Raspberry-Pi-class tier, and the release page ships pre-built binaries for common platforms with the installation guide at writefreely.org/start walking the first run. Community packaging reaches the Arch User Repository and the Nanos repository, and the Docker guide covers the container path.

## Docker with a MariaDB sidecar and a healthcheck

The container story is documented in two compose files and a pair of Dockerfiles. The development compose runs writefreely-web against a MariaDB container, with named volumes for the database and the keys, an internal-only network for the database, an external one for the web tier, and a config.ini mounted into place. The production image is a two-stage build, Go 1.25 on Alpine compiling the binary, with a Node step that compiles the Less stylesheets using less and less-plugin-clean-css, the frontend CSS pipeline living in the less directory, and the final stage is a slim Alpine running as the daemon user with a healthcheck polling port 8080 and a keys volume for the instance's cryptographic identity. An image has also been published to ghcr.io alongside Docker Hub, pushed by a GitHub Actions workflow, and docker-compose.prod.yml plus a docker-setup.sh helper cover the operational variant. The subtlety worth noticing is the OpenSSL legacy provider flag in the build, the Node toolchain needing the older algorithms for the stylesheet pipeline, a pinned workaround stated in the Dockerfile rather than left as folklore.

## The file list as a feature list

Reading the Go source tree sketches what the platform actually does. invites.go and monetization.go mark community-growth and paid-writing concerns, export.go handles taking content out, feed.go with the gorilla/feeds library produces syndication, email.go and the mailer directory with the Mailgun client handle correspondence, and oauth.go plus an oauth directory implement the sign-in surface. The web layer is the gorilla toolkit throughout, mux for routing, sessions, csrf, schema, the veteran stack holding the application together, with bluemonday sanitizing untrusted HTML and goquery parsing it. Migrations, cache, jobs, appstats and keys directories complete the operational anatomy, and keys.go alongside the key and keys directories carries the cryptography that ActivityPub and private blogs both lean on. It is a readable single-application Go codebase, no microservices, the kind a single administrator can hold in mind, which suits the product's audience of small publications and individual writers.

## Hosted on Write.as, translated by POEditor

The commercial shape is conventional open-core, the quickest deployment path is Write.as, a hosted service from the team behind WriteFreely offering fully-managed installation, backup, upgrades and maintenance, and the README notes it directly funds the free software work, with the copyright line naming Musing Studio LLC, 2018 through 2026. International support is a headline feature, blog elements localized in more than twenty languages with first-class support for non-Latin and right-to-left scripts, and translation contributions flow through a POEditor project rather than pull requests, the workflow that fits volunteer translators. Code, bug reports, feature requests, translations and documentation improvements each have a named channel, feature requests living on the discussion forum rather than the issue tracker, and the documentation itself is a separate repository, writefreely/documentation, so docs improve on their own cadence. Version 0.17.2 shipped on 2026-08-10, and the repository was pushed on 2026-09-28, an actively moving line for a project entering its ninth year.

## Against Ghost and WordPress, by weight

The comparisons people search for name Ghost and WordPress, and both come down to weight and direction. Ghost is a Node.js publishing platform oriented around newsletters, memberships and commerce, with a rich theme system and a marketing surface, where WriteFreely is a Markdown editor with federation and almost no surface to theme, the deliberate minimalism being the product. WordPress is the general-purpose CMS with the largest plugin ecosystem in publishing, and against it WriteFreely offers the opposite trade, one binary, one purpose, federation built in rather than bolted on. The differentiator neither competitor carries is ActivityPub, a WriteFreely blog is reachable from the fediverse out of the box, and the pen-name privacy model, multiple blogs under one account with no public association, is likewise absent from both. Teams should pick by what the writing is for, reach into federated communities and quiet minimalism favor WriteFreely, newsletters and plugin-driven sites favor the others.

## Conclusion

Use WriteFreely when writing is the product and the platform should disappear, a clean Markdown surface with optional federation into the ActivityPub network, running as one binary you own with SQLite or MariaDB behind it. Choose Ghost when newsletters, memberships and rich theming drive the site, or WordPress when the plugin ecosystem matters more than minimalism, since both trade the quiet writing surface for capability. Verify first whether federation with your existing communities is wanted, since ActivityPub support is the distinguishing feature, pick the database before the first run, and read the instances list to try the writing experience before installing anything.

## FAQ

### WriteFreely vs Ghost, which should you choose?

WriteFreely is a minimalist Markdown publishing platform in Go with ActivityPub federation, pen-name privacy and a distraction-free editor. Ghost is a Node.js platform built around newsletters, memberships and commerce with a rich theme system, so the choice is minimalism plus federation against marketing and monetization features.

### WriteFreely vs WordPress, how do they differ?

WriteFreely deploys as a single static binary with SQLite or MariaDB, keeps the writing surface deliberately minimal, and federates over ActivityPub. WordPress is a general-purpose CMS with a vast plugin and theme ecosystem, trading that minimalism for extensibility and familiar administration at higher operational weight.

### Does WriteFreely support other languages?

Yes, blog elements are localized in more than twenty languages, with first-class support for non-Latin and right-to-left scripts. Translations are contributed through the project's POEditor page.

## Sources

- [License: AGPL-3.0](https://github.com/writefreely/writefreely/blob/develop/LICENSE)
- [Project website](https://writefreely.org)
- [README](https://github.com/writefreely/writefreely/blob/develop/README.md)
- [Releases](https://github.com/writefreely/writefreely/releases)
- [writefreely/writefreely on GitHub](https://github.com/writefreely/writefreely)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/writefreely-writefreely
