Skip to content


Choose a tag to compare
@thebaer thebaer released this 11 Jun 16:30
· 353 commits to develop since this release

write freely


Major Features

Classic editor (T727)

If plain text and Markdown aren't your thing, now you can get a more "classic" writing experience with the Classic editor! This features more of a What You See Is What You Get interface that doesn't require the learning curve of Markdown. However, behind the scenes, posts are still saved as Markdown, so you can always switch between the Classic and standard editor. Admins can enable this option by setting editor = classic in the [app] config section.

Gopher Support (T559)

Give your audience a old-school, lightweight way to read posts on your WriteFreely instance, via the Gopher protocol! Enable it with the new gopher_port config value in the [server] section. When it’s enabled, multi-user instances will show all Public blogs at gopher://[host]:[gopher_port]/.

Gitea and Generic OAuth Provider Support (#293, #317, #405)

We’ve added more ways for users to authenticate with your WriteFreely instance, via Gitea or any generic OAuth 2.0 provider! Our generic OAuth provider support in particular gives you the chance to use WriteFreely alongside a range of applications that hold your users, from Mastodon to Nextcloud to Keycloak.

Web Monetization Support (T773)

Writers can now accept micropayments for their work via the proposed Web Monetization standard, and even publish exclusive content behind a paywall. Admins can enable this by setting monetization = true in the [app] section of their config, or changing the setting in their admin panel. This is just the start as we look to give readers more ways to financially support writers — read more about this on the blog.

ActivityPub Notes (#220)

Now, WriteFreely is more friendly to microblogs! If a post doesn’t have a double-line-break in it, it’ll be sent to the fediverse as a Note, rather than an Article. If you’d prefer to always send Notes, admins can set notes_only = true in the [app] config section.

Account deletion (T319)

It’s now easy for users and admins to quickly delete account data from WriteFreely via the web! Admins can access this option from their Admin Dashboard, and users can access it from their Account Settings page, if admins have configured Open Account Deletions (via the Dashboard or config file: open_deletion = true under the [app] section).

Post Signatures (T582)

This enables users to add a signature to all blog posts, and update it from a single location (the blog's Customize page).

User-Facing Changes / Fixes

  • Optimize Drafts retrieval (#295)
  • Support AP-style mentions of centralized social media accounts (#319)
  • Show warning in editor when local draft is out of date (#41)
  • Allow footer and header elements (#326)
  • Set pad light / dark theme based on system settings (#196)
  • Improved blog management navigation (#371)
  • Fix silenced user post visibility (#374)
  • Automatically resize CSS editor (T708)
  • Stop private and protected blogs from federating (#403)
  • Fix following from Mastodon with Authorized Fetch enabled (T820)
  • Fix language metadata gets reset to English after editing a post (#280)
  • Support logging out of password-protected blogs (T492)
  • Always show post actions on mobile devices (#309)
  • Include images as attachments in ActivityStreams data (#442)
  • Fix .md file import from Safari (#334)
  • Fix Custom CSS editor not working well on touchscreen devices (#452)
  • Support Drafts list paging (T401, T696)
  • Support title-only posts (#464)

Minor Changes

  • Support number+letter hashtags
  • Use a bigger font size for h2 (#217)
  • Ignore "collation mix" errors in GetCollectionRedirect() (#318)
  • Make dropdown navigation menus more accessible (#355)
  • Fix removal of query parameters on youtube embed links (#328)
  • Truncate lede at question mark (#316)
  • Fix double HTML-encoded meta tags (#340)
  • Fix header spacing on pinned posts (#385)
  • Fix unable to edit posts titled "Tags" (#305)
  • Set SameSite=None on session cookie (#443)
  • Make language highlighting matching case-insensitive (#429)

Admin-Facing Changes

  • Remove “No to!” log (#311)
  • Support encrypted database connections (#297)
  • Fix docker-compose (#407, #139, #323)
  • Fix Docker repository does not exist (#416)
  • Support user deletion from web interface (T319)
  • Support Unicode domain names (#457)

Developer-Facing Changes

  • Add CORS header to public APIs (#327)
  • Support slug parameter when publishing a post (T811)
  • Return a url property on Publish a Post endpoint
  • Support setting description at user registration

Performance / Backend

  • Move WriteFreely repo from writeas org to writefreely (#451)
  • Move MathJax library from submodule to single file (#176)
  • Improve static file serving with Cache-Control header (#322)
  • Use HTMLContent field in RSS feed (#418)
  • Remove writeas/nerds/store pkg dependency (#445)
  • Bump from 1.1.0 to 1.1.1
  • Bump from 1.0.0 to 1.1.1
  • Bump from 1.0.2 to 1.0.5
  • Bump from 1.6.0 to 1.7.0
  • Bump from 1.55.0 to 1.62.0
  • Bump from v3.4 to v3.5
  • Bump from 1.4.1 to 1.6.0
  • Bump from 0.2.0 to 0.2.1
  • Bump from 1.10.0 to 1.14.6
  • Bump from 1.0.2 to 1.2.0
  • Bump from 0.3.2 to 0.8.0
  • Bump from 2.1.1 to 2.3.0
  • Bump from 1.7.0 to 1.10.0

Upgrading from v0.12.0

Download the latest release for your operating system. Stop running your writefreely service, replace all files in your installation with the ones in the archive, and then start your writefreely service again.

Now make sure your database is backed up, and update it with:

writefreely db migrate

Finally, generate a new encryption key needed for this release (you can ignore messages about removing existing keys):

writefreely keys generate

No additional steps are needed to upgrade from v0.12.0. Follow the instructions in each previous release if you're upgrading from an earlier version.


If you are running a custom build: we made changes to site styles and added a Javascript dependency that needs to be compiled (prose.js). Run this to compile everything:

make ui


Thanks to everyone who contributed to this release!