WriteFreely is a clean, minimalist publishing platform made for writers

 

WriteFreely


Latest release Build status Go Report Card

 

WriteFreely is a clean, minimalist publishing platform made for writers. Start a blog, share knowledge within your organization, or build a community around the shared act of writing.

Try the writing experience

Find an instance

Features

Made for writing

Built on a plain, auto-saving editor, WriteFreely gives you a distraction-free writing environment. Once published, your words are front and center, and easy to read.

A connected community

Start writing together, publicly or privately. Connect with other communities, whether running WriteFreely, Plume, or other ActivityPub-powered software. And bring members on board from your existing platforms, thanks to our OAuth 2.0 support.

Intuitive organization

Categorize articles with hashtags, and create static pages from normal posts by pinning them to your blog. Create draft posts and publish to multiple blogs from one account.

International

Blog elements are localized in 20+ languages, and WriteFreely includes first-class support for non-Latin and right-to-left (RTL) script languages.

Private by default

WriteFreely collects minimal data, and never publicizes more than a writer consents to. Writers can seamlessly create multiple blogs from a single account for different pen names or purposes without publicly revealing their association.

Write.as

The quickest way to deploy WriteFreely is with Write.as, a hosted service from the team behind WriteFreely. You'll get fully-managed installation, backup, upgrades, and maintenance — and directly fund our free software work ❤️

Learn more on Write.as.

Quick start

WriteFreely deploys as a static binary on any platform and architecture that Go supports. Just use our built-in SQLite support, or add a MySQL database, and you'll be up and running!

For common platforms, start with our pre-built binaries and head over to our installation guide to get started.

Packages

You can also find WriteFreely in these package repositories, thanks to our wonderful community!

Documentation

Read our full documentation on WriteFreely.org —️ and help us improve by contributing to the writefreely/documentation repo.

Development

Start hacking on WriteFreely with our developer setup guide. For Docker support, see our Docker guide.

Contributing

We gladly welcome contributions to WriteFreely, whether in the form of code, bug reports, feature requests, translations, or documentation improvements.

Before contributing anything, please read our Contributing Guide. It describes the correct channels for submitting contributions and any potential requirements.

License

Copyright © 2018-2021 A Bunch Tell LLC and contributing authors. Licensed under the AGPL.

Owner
WriteFreely
Build a digital writing community.
WriteFreely
Comments
  • Federation with Hubzilla

    Federation with Hubzilla

    Describe the bug

    New posts not shown in Hubzilla

    Steps to reproduce (if necessary)

    Steps to reproduce the behavior:

    1. In Hubzilla, add a new connection to a write.as account
    2. On the write.as account, add a new post
    3. Check that this new post is visible elsewhere (ex: from misskey), but not on Hubzilla

    Expected behavior

    I should see the new post in Hubzilla

    Application configuration

    Tested in qua.name instance Version or last commit: v0.9.1-49-g901bf14

  • AP actors have erroneous sharedInbox

    AP actors have erroneous sharedInbox

    In my actor, https://blog.dereferenced.org/api/collections/kaniini, I see:

    "endpoints":{"sharedInbox":""}
    

    This is obviously wrong ;)

  • support pubgate

    support pubgate

    this moves the unmarshaling of a remote actor out into a new helper which accounts for the possibility of a context being a list or a single entity. i.e. a string or an object.

    basics tests are provided for both situations

    also go fmt'd the file activitypub.go

    during the course of working on this I found a missing string format variable in exports.go, in fixing that I also go fmt'd the file.

    Fixes #100 This also fixes #116 by using the followers Inbox if SharedInbox is not set.

    • [x] I have signed the CLA
  • data: URIs are incorrectly stripped

    data: URIs are incorrectly stripped

    Describe the bug

    The markup

    ![Red dot](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==)
    

    Should show a red dot as an image.

    It doesn't. Inspecting the generated HTML from the Markdown shows that the generated img element has no src attribute.

    I think, but have not confirmed, that this is because https://github.com/writeas/writefreely/blob/32e99d00415c6e86a9536d9b824dcdf0b119270d/posts.go#L1368 does not include data: as a valid protocol.

    Expected behavior

    img element should be created with the correct src attribute.

  • Field 'description' doesn't have default value

    Field 'description' doesn't have default value

    ERROR: 2018/11/11 11:57:33 log.go:26: Rolling back collections INSERT: Error 1364: Field 'description' doesn't have a default value
    ERROR: 2018/11/11 11:57:33 log.go:26: Unable to create user: Error 1364: Field 'description' doesn't have a default value
    

    I had to manually change description varchar(160) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL to description varchar(160) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL DEFAULT ''

    however after that it shows the same problem with privacy field. Either something wrong with my mySQL or with your schema.sql. Server version: 5.7.18-0ubuntu0.16.10.1 (Ubuntu)

  • db migrate error with utfmb4

    db migrate error with utfmb4

    I tried to upgrade to v0.12.0rc1

    "db migrate" gives the error ERROR: 2020/04/19 17:16:57 main.go:121: migrate: Error 1709: Index column size too large. The maximum column size is 767 bytes.

    I suspect this is due to my mysql being setup in utf8mb4.

  • Fix following from Mastodon with Authorized Fetch enabled

    Fix following from Mastodon with Authorized Fetch enabled

    This fixes federation with Mastodon instances that have Authorized Fetch turned on by signing the GET request to fetch the actor when a blog is first followed.

    Closes T820


    • ☑ I have signed the CLA
  • Send out ActivityPub mentions (T627)

    Send out ActivityPub mentions (T627)

    This pull request adds code that scans the text of each post to be published for handles of the type @[email protected], uses webfinger to ask ActivityPub endpoints about them, gets their inbox and actor IRI's and adds mention tags to the post. Finally it adds the users to the CC list of the recipients of the activity.

    This works in pleroma but not in mastodon unless we set the object type to "Note" instead of "Article"

    T627

  • Possible memory leak?

    Possible memory leak?

    Describe the bug

    I'm running WriteFreely v 0.9.1 on my Scaleway instance with 2GB of RAM. It's a single-user federated instance with SQLite as backend. I'm managing it via systemd with the following service description:

    [Unit]
    Description=Write Freely Instance
    After=syslog.target network.target
    
    [Service]
    Type=simple
    WorkingDirectory=/home/groosha/writefreely
    ExecStart=/home/groosha/writefreely/writefreely >> /var/log/writefreely.log
    Restart=always
    
    [Install]
    WantedBy=multi-user.target
    

    The only modification I made is replacing one of "letter-avatars" with a custom one to see a proper profile pic on Mastodon.

    Symptoms

    If I run WriteFreely for a long time (let's say, a month) without even touching it (no users, no new posts, nothing), it consumes almost all free RAM on server, causing other apps to have problems. For example, my Python scripts which are running as cron jobs and regular processes, raise some exceptions like RuntimeError: can't start new thread or vedis.cpython-35m-x86_64-linux-gnu.so: failed to map segment from shared object. Also running htop shows that writefreely process consumes ~60% of RAM: изображение (notice that I'm running only one process, but htop shows all threads)

    After I restart writefreely with systemctl restart writefreely everything gets back to normal: изображение (here I enabled "tree" view of processes, showing that I have only 1 process of writefreely and others are most likely threads)

    My bad I didn't write down Go internal stats from /admin page, I guess it would help a lot.

    Expected behavior

    RAM usage should depend on active users or API usage, not increase as the time goes by.

    Application configuration

    • Single mode or Multi-user mode? Single mode
    • Database? SQLite
    • Open registration? No
    • Federation enabled? Yes
    • Operating system? Ubuntu 16.10 (oops!)

    Version or last commit: 0.9.1

  • check for lessc executable in any location

    check for lessc executable in any location

    previously the checks were explicit locations which does not work when using something like nvm to manage node packages and versions.

    this checks for the executable and sets the script variable LESSC to the full path of the one found. if none was found the make command will error.


    • [x] I have signed the CLA
  • Invalid JSON-LD syntax; @context must be an object.

    Invalid JSON-LD syntax; @context must be an object.

    When following my writefreely user [email protected] from friendica [email protected] I get the following error response upon writing new posts / updating posts in writefreely:

    2020/04/10 22:51:59 Response: JsonLdException: [jsonld.SyntaxError]: Invalid JSON-LD syntax; @context must be an object.

    From the json-ld spec it also seems that the context is supposed to be an object or a link to a jsonld file: https://www.w3.org/TR/2020/CR-json-ld11-20200316/#the-context

  • Self closing HTML Tags: ( <e /> ) in Posts break Site Layout

    Self closing HTML Tags: ( ) in Posts break Site Layout

    Describe the bug

    Self Closing HTML Tags, for instance when embedding iframes in posts, break the site layout. This is a normal opening/closing tag: <a></a> And this is a self-closing tag: <a /> Self closing tags are allowed by browsers, for certain elements.

    You can see the damage here: notice that everything rendering after the cheeky emojii is gone, every post below and the footer is gone.

    Steps to reproduce (if necessary)

    Steps to reproduce the behavior:

    1. Open the compose form
    2. Type <iframe src="https://pluspng.com/img-png/lmao-png-big-image-png-2400.png"/>
    3. Publish to your blog
    4. The site is now wrecked (invalid html is generated); Screenshot 2023-01-08 014536
    5. Sometimes, at least on my instance, this would also make the edit buttons stop working, preventing me from fixing the mess

    Expected behavior

    The HTML sanitizer or templater or whatever Should've output <p><iframe src="https://pluspng.com/img-png/lmao-png-big-image-png-2400.png"/></p> Instead it outputs <p><iframe src="https://pluspng.com/img-png/lmao-png-big-image-png-2400.png"/>&lt;/p&gt; Which, since the browser is now waiting for a closing p tag, breaks everything below the post.

    Application configuration

    [[doesn't matter]]

    • Single mode or Multi-user mode?
    • Database? [mysql/sqlite]
    • Open registration? [yes/no]
    • Federation enabled? [yes/no]

    Version or last commit: Version 0.13.2 (@thebaer, this is #566 in a less confusing form, since this time i know from the start what my issue is)

  • import problems

    import problems

    Describe the bug

    I tried to export and import the data from one instance to another. Import Post only works for .txt files.

    For text format import, modified slug will be re-autogenerated to a default name because the slug information is not recorded in the txt files. For non-latin languages, the auto generated slug looks very strange(sometimes too long) as a link address, I tend to change it for something short and readable.

    The date for an edited txt file (e.g, find and replace multiple hyperlinks) will change to the modified date, but I am expecting it stays to the created date.

    Import .csv file returns to the error message = 1 error occurred: * failed to create post from filename.csv .json file is not allowed to import.

    Expected behavior

    matadata: slug and created date (after editing a txt file) keep the same. If import .txt files could solve the changed matadata problems, then it is ok that .csv and .json are not working properly.

    Application configuration

    • Multi-user mode
    • Database mysql
    • Open registration? no
    • Federation enabled? yes

    Version or last commit: v.0.13.2

  • Catch and output directory walking errors

    Catch and output directory walking errors

    Previously, app would panic and admins would see unhelpful errors. Now we catch any errors and return them and/or log.

    This closes #620


    • ☑ I have signed the CLA
  • Segmentation violation on FreeBSD 13.1

    Segmentation violation on FreeBSD 13.1

    I am trying to set up a fresh install of writefreely 0.13.2 on FreeBSD 13.1 (MySQL backend) and getting a segfault when trying to create an admin user (i selected the multi-user instance option during configuration).

    The package is directly from FreeBSD repositories. image

  • Additionnal config for oauth registration

    Additionnal config for oauth registration

    Hi,

    I configured an instance using Keycloak for SSO but I wanted to be able to allow registration after a successful authentication without opening it to everyone or using an invitation code.

    When using an external oauth provider I believe it makes sense to be able to control registration independently of the global setting.

    Added allow_registration to external oauth configs to allow the ability to control this logic. I omitted it from the WriteAsOauth config since I believe it does not make sense, just reused OpenRegistration when I needed to set a parameter in configureWriteAsOauth. I added the AllowRegistration control to the oauthHandler since it makes the change way less verbose than adding an additional function to all the different oauthClient.


    • [x] I have signed the CLA
  • Widen oauth_users.access_token to prevent insertion failure

    Widen oauth_users.access_token to prevent insertion failure

    Hi,

    I configured an instance using mariadb and Keycloak for SSO. User creation was failing since the returned access token is longer than the current field in db (VARCHAR(512))

    I believe switching to TEXT is better than setting an arbitrary length, overhead should be minimal especially since I don't believe it's in any index.

    I added a conditional to run it only on MySQL since I believe SqlLite only use TEXT.


    • [x] I have signed the CLA
Ukuleleweb is a minimalist Wiki with the look and feel of the original WikiWikiWeb

Ukuleleweb Ukuleleweb is a simple Wiki implementation in the style of the original WikiWikiWeb / C2 wiki. Few dependencies The only dependencies are a

Feb 7, 2022
Sample Go REST API implementation with DDD using Clean Architecture.

This layer is a part developed for client-side (mobile, web, etc.) applications to access our domain. It will forward the requests from this layer to the application layer and expose the response it receives from the application layer.

Jan 3, 2023
Clean Architecture template for Golang services
Clean Architecture template for Golang services

Go Clean template Clean Architecture template for Golang services Overview The purpose of the template is to show: how to organize a project and preve

Oct 19, 2022
Implementation of clean architecture in golang with gin-gonic & gorm

Boilerplate API Boilerplate API template includes all the common packages and setup used for API development in this Company. Development Copy .env.ex

Feb 15, 2022
Go-gin-ddd-cqrs - Clean api rest with Go, Gin and GORM
Go-gin-ddd-cqrs - Clean api rest with Go, Gin and GORM

GOLANG API REST Clean api rest with Go, Gin and GORM. Clean Architecture with DD

Oct 21, 2022
Golang gin clean

Dependency go get github.com/gin-gonic/gin go get github.com/jinzhu/gorm go get

Feb 11, 2022
Clean Architecture using Golang with Gin framework

Clean Architecture using Golang with Gin framework Template Structure Gin is a web framework written in Go (Golang). It features a martini-like API wi

Dec 16, 2022
Consul Load-Balancing made simple
Consul Load-Balancing made simple

Notes From release 1.5.15 onward, fabio changes the default GOGC from 800 back to the golang default of 100. Apparently this made some sense back in t

Jan 5, 2023
a url shortener made using go and redis

__ | |--.--.--.----.-----. .-----.-----. | <| | | _|-- __|__| _ | _ | |__|__|_____|__| |_____|__|___

Dec 10, 2020
Oct 1, 2021
GoatCounter is an open source web analytics platform available as a hosted service or self-hosted app

GoatCounter is an open source web analytics platform available as a hosted service (free for non-commercial use) or self-hosted app. It aims to offer easy to use and meaningful privacy-friendly web analytics as an alternative to Google Analytics or Matomo.

Dec 29, 2022
an online REST renting book platform which you can authenticate, order, reserve a book in your account.
an online REST renting book platform which you can authenticate, order, reserve a book in your account.

BOOK MAN an online REST renting book platform which you can authenticate, order, reserve a book in your account. it's a microservices project with hig

Jul 22, 2022
Mattermost is an open source platform for secure collaboration across the entire software development lifecycle.
Mattermost is an open source platform for secure collaboration across the entire software development lifecycle.

Mattermost is an open source platform for secure collaboration across the entire software development lifecycle. This repo is the primary source for c

Jan 2, 2023
A cross platform single binary tool to work with draw io files

SNIPO SNIPIO is a cross platform single binary tool to work with draw io files With snipio you can do the following operations: list all layers in a d

Jan 7, 2023
A clean, Markdown-based publishing platform made for writers. Write together, and build a community.
A clean, Markdown-based publishing platform made for writers. Write together, and build a community.

WriteFreely is a clean, minimalist publishing platform made for writers. Start a blog, share knowledge within your organization, or build a community

Jan 4, 2023
Simple and configurable Logging in Go, with level, formatters and writers

go-log Logging package similar to log4j for the Golang. Support dynamic log level Support customized formatter TextFormatter JSONFormatter Support mul

Sep 26, 2022
Golang counters for readers/writers

Datacounter Golang counters for readers/writers. Examples ReaderCounter buf := bytes.Buffer{} buf.Write(data) counter := datacounter.NewReaderCounter(

Oct 9, 2022
A tool for testing, building, signing, and publishing binaries.

gomason Tool for testing, building, signing and publishing binaries. Think of it as an on premesis CI/CD system- that also performs code signing and p

Dec 15, 2022
CLI for publishing/receiving CloudEvent messages through NATS

cenats CLI for publishing/receiving CloudEvent messages through NATS Use Case cenats is designed to make testing services that generate or consume eve

Nov 5, 2021
this service provides an API for publishing and managing your articles

REST API Для Публикации и Работы с Articles на Go В работе применены следующие концепции: Разработка Веб-Приложений на Go, следуя дизайну REST API. Ра

Jul 25, 2022