# WriteFreely

Minimalist federated blogging server in one Go binary, driven by the official Write.as API and wf CLI.

WriteFreely is a single-binary Go publishing platform for blogs and writing communities, with ActivityPub federation, multiple blogs per account, hashtags, pinned pages, and 20+ locales, configured by a config.ini. The same Builder (Musing Studio) runs Write.as as the hosted edition and documents an API plus the writeas-cli whose wf command targets any WriteFreely instance.

Alternative to: Medium, Substack

- Capabilities: adaptable, operable
- Vertical: content-publishing
- Shape: business-app
- Form factor: web-app
- Execution model: deterministic
- Provenance: human-written (recorded, never ranked)
- Repo: https://github.com/writefreely/writefreely (AGPL-3.0), 5240 stars, last commit 2026-09-01
- Last activity: 2026-09-01
- Page: apps/writefreely--writefreely.html
- JSON: apps/writefreely--writefreely.json

## Use it when

- I want a fast, plain blog I own that also shows up in the fediverse
- I want my agent to publish posts from my notes to my own instance with a one-line CLI

## Gotchas

- AGPL-3.0 (server); the CLI is GPL-3.0
- Read operations on public content need no auth; writes need a token from /api/auth/login with username and password
- No env var surface; configuration is the ini file only
- Some write.as-only API features are not in WriteFreely; build against the WriteFreely subset

## Editions

- Self-hosted: Free, open source
  - source: https://github.com/writefreely/writefreely
  - binary: https://github.com/writefreely/writefreely/releases
  - container: https://ghcr.io/writefreely/writefreely
- Write.as managed hosting: Free, closed source
  - hosted: https://write.as/writefreely

## Adaptable: make it yours

Effort: config-only (3 things to edit)

Everything is config.ini: [server] port, bind, TLS or autocert; [database] SQLite or MySQL; [app] site_name, host, single_user, open_registration, federation, editor, max_blogs, local_timeline, user_invites, default_visibility; [email] SMTP or Mailgun; [oauth.generic] for SSO. Flip single_user for a personal blog or open_registration for a community. Templates can be overridden in the templates directory.

- Env vars: none
- Config files: config.ini, docker-compose.yml, templates/
- Prompt files: none
- Accounts you'll need: Mailgun or SMTP (optional, for email features)

## Operable: what an agent can drive

Operability: official. Interface: api at https://developers.write.as/docs/api/ (published by the builder, both).

### Reach (partial coverage)

- Publish a post: reachable. API POST /api/posts and /api/collections/{alias}/posts; wf CLI publishes to any instance
- Update and delete posts: reachable. API update, unpublish, delete post
- Create and manage blogs (collections): reachable. API collections create, retrieve, update, delete
- Pin posts as static pages: reachable. API pin and unpin posts
- Keep drafts: reachable. writeas-cli: publish anonymous posts or drafts; API posts outside a collection
- Move posts between blogs: reachable. API move posts between collections
- Run several blogs from one account: reachable. API user collections list; max_blogs in config.ini
- Federate over ActivityPub: not reachable. federation is a config.ini switch, not an API operation
- Invite and manage users: not reachable. not in API; admin UI or config.ini user_invites
- Browse the local reader timeline: not reachable. no API endpoint listed; local_timeline is a config switch

## Code stack

- Languages: Go, JavaScript
- Frameworks: none
- Package manager: go modules
- Database: SQLite, MySQL, MariaDB
- Hosting target: static binary, Docker (ghcr.io/writefreely/writefreely), docker-compose

## Evidence and confidence

- formFactor: README: deploys as a static binary with built-in SQLite; browser UI (confidence 0.95)
- executionModel: no model at runtime (confidence 0.95)
- operability: developers.write.as/docs/api (Builder domain) plus writeas-cli README: 'publishing to Write.as and any other WriteFreely instance'; wf --version (confidence 0.9)
- effort: writefreely.org/docs/latest/admin/config documents config.ini sections and keys (confidence 0.9)
- editions: README: pre-built binaries, ghcr image, AGPL; Write.as managed hosting from the same team (confidence 0.8)
- active: pushedAt 2026-09-01; 107 open issues; CLI pushed 2026-07-10
- provenance: Musing Studio LLC since 2018; no vibe-coded claim (confidence 0.9)
- reach:  (confidence 0.85)

## Open questions

- Write.as managed WriteFreely hosting price

## Sources

- https://github.com/writefreely/writefreely (sourcing:content-publishing:github)
- https://developers.write.as/docs/api/ (analysis:content-publishing)
- https://writefreely.org/docs/latest/admin/config (analysis:content-publishing)
- https://github.com/writeas/writeas-cli (analysis:content-publishing)
