Hacker News new | past | comments | ask | show | jobs | submit login
Show HN: WriteFreely – minimalist, federated blogging platform (writefreely.org)
337 points by thebaer 4 months ago | hide | past | web | favorite | 112 comments

To explain a little more behind this project: this started out as a simple, privacy-focused blogging platform called Write.as.

We've been running a Mastodon instance for a while and keeping up with the fediverse, so over the summer as it got much easier to implement, we added support for ActivityPub (the protocol behind Mastodon, PixelFed, Funkwhale, etc.) The fediverse has a strong FOSS culture, so after releasing AP support, I got to work on opening up the source for Write.as, and this is that final result.

Write.as has existed for 4 years, so the application code is very stable. But right now I'm getting the code to a place that works great in any configuration, installs easily, etc.

It looks like the fediverse is very close to becoming an interactive usenet.

All that’s needed next is feed aggregators as a subscription service, then content creators won’t have to worry about bandwidth costs.

Just have to say. I've been writing and publishing on the web for more than 20 years now. I've had a couple of high-traffic posts, been slashdotted (once), and was once featured in a blog post on The Atlantic. I had a podcast for four years with a moderate number of subscribers. All of this was self-hosted. I have NEVER had to worry about bandwidth costs. The bandwidth included with the hosting/VPS plans I've used over the years has always been more than sufficient.

This makes me think that bandwidth 'insurance' plans should be a thing. Pay a nominal cost each month to ensure that if something on your site becomes a massive viral hit you get a few weeks of bandwidth cost defrayment to weather the storm and allow you to find a longer term solution if needed.

Bandwidth is SO cheap though. Even bulk "overage" usually runs about $1/100GB. That's nothing.

When servers got slashdotted it was almost, even way back then, running out of CPU/Database connections, not bandwidth.

It's cheap unless:

a) you're a hobbyist/minor (effective budget of $0)

b) you're on cloud hosting and go over without a budget set

Seriously, bandwidth just is SUPER cheap period. The fact that some people theoretically might not even have $4.99 to kick towards their "hobby" does not negate that fact.

Like I said above, I did all the stuff I did with nothing more than $5/$10 month cloud hosting plans. Almost no one is going to hit any kind of bandwidth limits these days unless they are trying to run SaaS or just pirating full BluRays in the dumbest ways possible. But we're not talking about those people, we're talking about hobbyist content creators.

i'm a hobbyist, I've been slashdotted, front page of hn multiple times, and on other high profile sites that sent _lots_ of traffic. bandwidth cost is simply not an issue unless you're self hosting video files or some other obscenely large files, and there's no reason to be self hosting things like that. It would only be a concern if a botnet started hitting me with requests. I'm not on any fancy server plan.

That being said, I do pay for a monthly plan, because relying on free handouts for anything that matters is never a reasonable approach.

Simply being sensible about what kind of files you're asking people to download solves 99.9% of this problem and makes your site more enjoyable (faster) for users (especially mobile ones).

Define A.

A $5/mo digital ocean instance comes with 1TB of transfer. That's a lot unless you're doing something like self-hosting video.

Heroku free tier includes up to 2TB/month.

Even the free tier of AWS comes with 15GB/month.

I guess I'm more familiar with AWS but I thought the free tier was only for the first 12 months.

Really? It makes me think the opposite. Supposing I had ever bought such a policy, 100% of its cost would have been a complete waste, despite having some extremely high-traffic hits.

But all that aside, this product exists already, it's called a CDN.

Not a bad business idea.

Not a bad idea in general, but very risky as an independent business because web hosts can just offer it as a freebie or add-on the moment it starts catching steam with customers. They often already do, although they don't say so or commit to it.

Yes, it would only be viable for local businesses that can compete because they use budget peering or bandwidth.

Not very “next YouTube” in nature.

Isn't that Cloudflare?

> I have NEVER had to worry about bandwidth costs.

Well obviously you aren't using the right JS framework then. Modern technology will fix this problem for you. Especially if your pages are loading too fast.

AFAIK ActivityPub uses a fan-out to other servers using the sharedInbox of the receivers [1], this makes the cost of distribution to be diluted by all instances of the fedverse that follow that account.

And what are you missing on the current aggregator features? do you have in mind anything more then the normal action of following other users?

[1] https://www.w3.org/TR/activitypub/#shared-inbox-delivery

Awesome, that's really good to hear! Happy user here - I was recently on the lookout for a simple hosted blogging platform for a personal project, and write.as fit the bill perfectly.

Will PRs for WriteFreely generally make it into Write.as?

Yep! This is the core software behind it all, so bug fixes and new features will make it into Write.as too. It's also kept up-to-date with changes as soon as they're finished, so you'll see everything live there first.

Really glad you're liking it though :)

I've been poking around for a good blog platform (my website currently is generated statically with Hugo).

There are certain features that I've been looking for: mathjax/latex, data visualization (though, this could be using pre-generated images), jupyter notebook compatibility, image facilities...

I know that goes beyond the slick simplicity you've got here, but for the work I do, I want to be able to speak in more than one way.

Is there an opportunity for contributing these features?

Absolutely. We do support MathJax already (you can enable it in blog settings), but I'm happy to talk about adding these into upstream, or maybe starting to support plugins for these sort of things. If you want to join the forums [0] we can start talking about what that might look like!

[0] https://discuss.write.as/c/writefreely

I've noticed you write 'we' everywhere, but as far as I can tell you've done everything by yourself?

Seriously impressive work by the way, and I'm really happy to see such a well-developed project use Go+ActivityPub.

That's pretty common when talking about the actions or product of a non-sentient structure. It helps to differentiate the product from the person. If you say "I released a new version", the end result is tied to the individual. If you say "we released a new version", even if it's just one person, it makes it clear that the new version is the output of the company/organization/collective/structure/etc, even if that company/organization/collective/structure/etc is just one person.

It's kind of like a single-owner LLC. The structure limits the liability by detaching responsibility from the owner and attaching it to the corporation, even though the corporation is in reality just the one person. It's a very abstract concept that just implies a product can be separate from the individual who created it.

The editorial "we" I suppose :)

As for the code, yep I built everything myself (and wrote about it here [0]). But I've also had the help of people translating the app, giving feedback, and making suggestions along the way. Listening to people and filtering ideas through my own vision has really made the product what it is today.

Thanks, though! I'm just excited to keep pushing the AP ecosystem forward and making the platforms on it more usable.

[0] https://write.as/matt/how-i-built-a-multi-platform-app

You must be knowledgeable of the subscription protocols. I wrote a concept for an aggregator, but it would need a custom value with each post. Do you know if there is room for that?

It's a simple rating by the posting user (e.g. 7 out of 10, you could even just post it with the text like so: [7/10] But that's a little confusing.)

The one other question: If I had this rating, could I sort all posts from the last year by rating? Or is the efficient look-up of posts tied to time and it's hard to scan for ratings through a year worth of posts?

>Mastodon, PixelFed, Funkwhale

OT, but how did "Mastodon" turn out to be the best name anybody could come up with?

Mastodon metal AF what's wrong with that?

While I know this isn't a particularly serious little side-thread, it's actually interesting to many how many folks I've talked to who are not committed to something like Mastodon for philosophical reasons who are put off by the naming choices. It's not Mastodon itself that's the problem: it's insisting on calling posts "toots."

>it's insisting on calling posts "toots."

I didn't know they did that. That is decidedly not-metal.

It's not that "mastodon" is bad, it's that the others are so much worse.

Word. Also, it was the name Van Halen used before they became Van Halen.

Sounds nice, but from a technical point of view... Why does it require a MySQL server?

I mean, yes, in general, MySQL has a higher performance than let's say SQLite, but for most users, a properly handled SQLite file should deliver enough performance and the setup would be a lot easier and the overhead for small blogs would be much less.

But hey, it is still a young project and the general concept is looking great :-)

Thanks :) You're exactly right, which is why it'll support SQLite by v1.0. Again this came out of our hosted platform, so there's still plenty to do to make it easy for self-hosting. But the goal is an entirely self-contained binary -- upload it, run, and you're online.

Excellent :-)

I just looked through the other repositories and found the vim script [1] which kinda fits my personal workflow :-D

I really like what you are building.

[1]: https://github.com/writeas/write-as.vim

Another Go project that provides a self-hosted wiki is https://github.com/schollz/rwtxt and rwtxt uses Sqlite for data storage. It may be worth your while to consider that source code.

Why SQL at all? Are there so many relations in the database, that a relational model is a need? Since it has a "social" component, it may be, but I just wanted to place a quick question, without analyzing the project.

Thank you.

What other data storage do you suggest in place?

Since I do not know the data he stores, and in which way (model), I can not comment on this. This is why I asked.

If I'd be to do something similar (actually, I do) I'd use an XML (document) backend, like eXist or BaseX along with XSLT, XQuery and REST.

Ideally it would use some kind of wrapper that supports multiple DB backends.

In an ideal world that'd be great, but for single-dev projects you can more effectively deliver features if you just pick a database and stick to it.

It's a shame it's MySQL (I'm in the Postgres camp these days) but MariaDB isn't awful and for such a tiny project it doesn't matter.

I'm going out on a ledge here with this idea/question as I'm not sure if it makes total sense...I've been researching different methods for database interoperability and have been poking at Apache Avro. Would it be viable to tie the DB into Apache Avro, host a JSON schema with clear indication as to how the file is stored and add in schema for whatever other database you want to connect to? "Avro relies on schemas. When Avro data is read, the schema used when writing it is always present. This permits each datum to be written with no per-value overheads, making serialization both fast and small. This also facilitates use with dynamic, scripting languages, since data, together with its schema, is fully self-describing. When Avro data is stored in a file, its schema is stored with it, so that files may be processed later by any program. If the program reading the data expects a different schema this can be easily resolved, since both schemas are present. When Avro is used in RPC, the client and server exchange schemas in the connection handshake. (This can be optimized so that, for most calls, no schemas are actually transmitted.) Since both client and server both have the other's full schema, correspondence between same named fields, missing fields, extra fields, etc. can all be easily resolved. Avro schemas are defined with JSON . This facilitates implementation in languages that already have JSON libraries" I know of a few other ways to achieve this result (choosing which database the user wants to use while maintaining interoperability) but would love feedback on better approach to understanding this process.

I don't think avro helps in any way.

Right now, the common solution is to have some query-builder library which is able to build up a SQL string for a given database based on higher level descriptions of what you want. See ActiveRecord, SQLAlchemy, etc.

This lets the query-builder library hide differences between different sql languages as part of its internals.

These query-builder libraries typically come as part of an ORM, which means you define your data as an object in your language (e.g. a ruby class).

From what it looks like, avro would only be useful for replacing the definition of an object (the programming language class), but that's not a sticking point right now, and defining classes in your chosen language is easier than pulling in a different schema language... and replacing that portion still doesn't help with the true problem, which is that a SQL string for MySQL may not work on sqlite.

I don't see how avro could help in regards to the different wire format different SQL databases have, nor could it help build queries as far as I can tell (e.g. knowing that 'ON DUPLICATE KEY ...' in mysql is kinda like 'ON CONFLICT ...' in sqlite). Even if it could store these differences, the query-builder library already stores them quite efficiently in their language, and such libraries exist for almost every language.

I do not see how Avro helps anything in this area. If you could describe in more specific detail where you think Avro might be relevant, I'd be happy to consider it from that angle. Your comment above is a bunch of words which talk about avro, but not about how it might apply to this specific problem. (Also, paragraph breaks help readability)

Have you done any research into how likely it is that a visitor from your demographic understands what "federated" means in this context? I ask because it's part of the tagline, so if you don't understand a key word in the product description you're probably less likely to show interest in it.

Right now it's aimed at existing users of decentralized social software (e.g. Mastodon), but yeah, that's great feedback. Thanks for the input!

What DOES "federated" mean in this context?

In this context, it means that content from this service is shared with other servers. This is different from decentralized - in a decentralized network, every client communicates directly with other clients, whereas in a federated network, clients communicate with central servers but the servers can interoperate . Email is a good example of a federated network - mail clients communicate with centralized mail servers, but mail servers can send messages to other mail servers. To extend that analogy, when you write an article on Write.as your browser sends that data to the Write.as server, but the server federates that data to various other servers - Mastodon instances, Pleroma instances, etc. This is what enables Mastodon et. al users to like, follow, and share content posted to Write.as.

Thanks for the explanation :) This comment should be higher up for people to read...

I'm still not exactly sure, which is definitely a red flag to me since I'm already a nerdy type that should at least understand the value proposition.

It means your posts are sent out to followers via ActivityPub. It explains this below, in the "publish to the fediverse" section.

Glad someone pointed this out. I had to Google it, then urban dictionary, then back to Google with an “open source” appended to the query, only after happening upon these comments. So far, I think it means “decentralized”

It does not mean exactly the same thing as decentralized. It is true that it is not fully centralized with one party controlling everything, but it is also not fully decentralized with each user running their own server.

Instead, multiple servers run by different parties share data with each other. End users can use the system without running their own server.

I like this idea, and I'm eagerly waiting for this to catch on. Following up from this, I have 2 questions that keep me from entering the ecosystem:

- I don't want to host complicated platforms, all I need is a statically generated blog. ActivityPub could be the way to let people comment on my posts without forfeiting the staticness. Is there any static blog system that integrates with ActivityPub?

- Are there any native desktop clients supporting ActivityPub (micro)blogging? I've set up a Mastodon account, and the only way I interact with it is posting via a command-line tool. It's write-only for me because I can't be hassled to use the browser, and it would be nice to change that.

> - Are there any native desktop clients supporting ActivityPub (micro)blogging? I've set up a Mastodon account, and the only way I interact with it is posting via a command-line tool. It's write-only for me because I can't be hassled to use the browser, and it would be nice to change that.



> - I don't want to host complicated platforms, all I need is a statically generated blog. ActivityPub could be the way to let people comment on my posts without forfeiting the staticness. Is there any static blog system that integrates with ActivityPub?

I'm 90% sure this doesn't exist right now in a usable form, closest is just something to ping Mastodon when you run your upload.

If you link a comment system in the way you suggest, someone would need to host it for you a la Disqus which is where you'd likely come full circle to "hosted blog platform".

> - I don't want to host complicated platforms, all I need is a statically generated blog. ActivityPub could be the way to let people comment on my posts without forfeiting the staticness.

https://fed.brid.gy/ and https://webmention.io/ can be duct taped together to provide roughly this. I use webmention.io and brid.gy on my blog with Twitter and (until Cambridge Analytica) Facebook comments, but haven't got around to using the federated aspects of bridgy yet.

Very cool to see more action in the ActivityPub space – one of the nice aspects of the federated model is that more users of the protocol have a function of accumulative user bases, not directly competing with one another.

So in the future when Plume (a W3C sponsored ActivityPub blogging platform) eventually launches, there's no reason for WriteFreely and/or Plume readers to really worry about which platform a given author uses!

Here's an arch package, let me know (on the AUR, not here) if you notice anything wrong: https://aur.archlinux.org/packages/writefreely/

Awesome! Thank you!

I like that there aren't any "likes" or "claps" in WriteFreely. These always feel like argumentum ad populum mechanisms, designed to give a false sense of legitimacy to the content.

Great point. I upvoted your post to give it more legitimacy…

What does federated mean is this context?

(from a non-native English speaker)

It means your blog can communicate with other software that supports ActivityPub, so you aren't locked in to one community. For example, I can follow your blog from my Mastodon (a Twitter-like project) as if it were a Mastodon account.

Ah, thanks! So it's not non-nativeness at fault :) Just that I'm some-one with out the knowledge you assumed.

A canonical example of a federated system would be email. Anybody can participate in the email ecosystem as a function of the SMTP protocol.

A non-federated system would be a “walled garden” like Facebook or Twitter.

Same question.

I have heard it used to mean there is no one central server but a lot of people put their servers together. I don't understand it in this blogging context because you can always put up your own blog on your server.

How is running your blog or blogging platform on your own server different from other blogs or platforms?

"Interact with the decentralized social web via ActivityPub."

It directly speaks to Mastodon and other Fediverse software.

Super awesome! I love the combo of actual open source + option of paid hosting (so those who wants can sponsor development AND avoid the hassle of running their own instance.)

(AGPL still scares me, but for a anything that doesn't need API access it should be OK I guess?)

I've been looking for something to fill the void left by WordPress and Ghost in the self-hosted blog engine space.

This feels like it could do the job. I'll look at it a little closer and see if it has good answers to my remaining questions.

In what sense did wp and ghost leave a hole? They became unfashionable?

In my case, WordPress and Ghost left my toolbox for two separate reasons. Note that these reasons are my own, and should not be taken as a wider denunciation of these products.

WordPress went away because I got tired of all the little fixes and tweaks I had to make to get it to be "just right." Even then, the way the code is structured leaves a bad taste in my mouth.

Ghost went away because I just don't like Node.js, and because some of the promised features still haven't materialized.

I think the main problem to be solved for your audience is "discoverability".

How (well) does this project solve it?

Today I solve this on Write.as with a site called Read Write.as [0], which has a modest, but regular group of readers -- that's my model.

So for the WriteFreely project, I'm also building a federated reader app [1] that'll connect to your blog(s), interoperate with other ActivityPub platforms, and be a similar destination for people looking to read, rather than write. You could imagine people hosting the two platforms together to create mini-Mediums across the web, which also communicate with each other.

Otherwise, as things are today, enabling people to follow your blog from the fediverse means they can read your posts right in their social media streams and share them with their followers by clicking one button.

[0] https://read.write.as

[1] https://read.as

Write.as looks like a great platform. Just started exploring it. Would be great if there was a free plan for open source organizations and authors, so we could make use of the Snap.as service as well. That'd be enough to get me off of Medium.

We do have discounts for open source projects [0], but send me an email (hello at write.as) -- I'd be happy to talk about a bigger discount for what you're doing.

[0] https://write.as/pricing/opensource

This is probably exactly what I've been looking for as a blogging platform.

Definitely giving this a go.

The markup is documented at https://guides.write.as/writing/

That page was a bit hard to find.

At first glance that just looks like markdown ..?

Look again. For example, it has a #tag feature.

I've been on the lookout for a lightweight blog engine for a while. This looks really nice!

Some suggestions for you:

- You might want to include a direct link to your sample editing experience from the page linked to above. I found it on your Github.

- I think it's really important to support "import image from clipboard" - much like what Twitter does, for example. This is huge for usability, especially for folks who don't want to / don't understand how to embed images into blog posts.

Thanks! This is great feedback -- I'll be sure to incorporate it.

Otherwise let me know if I can help with anything as you get set up.

For folks who don't know how to embed images into blog posts, how do you do that?!

We'll eventually build in image uploads, but for now, you need to upload them somewhere and then use a little Markdown to insert the image:

    ![the earth](https://i.snap.as/6NFG7Tj.jpg)
Here's a guide: https://guides.write.as/writing/#adding-images-to-posts

I just realized that you are the creator of the extension "Make Medium Readable Again" and would like to thank you so much for doing just that!

Hah, indeed. Happy to help make the web better in many ways :)

I set up a [docker image for writefreely](https://gitlab.koehn.com/docker/writefreely) and I love the clean and minimal-yet-everything-I-want UI. Any chance you'll open source snap.as so I can self-host my images?


I'm going to follow a similar path for Snap.as and the rest: getting the product right as a hosted platform (only worrying about a single configuration, not doing additional project management, moving faster, etc.), and then go open source when it's essentially "finished," like Write.as is.

Especially while the company is still working toward sustainability, I think this is the best way to keep our focus on building a great product, ensure we continue growing, and build for our primary users (non-techy folks).

This is really neat! Will it be possible to use mastodon clients to post to the blog? That would be really awesome.

Possibly! If someone wants to implement the Client-to-Server side of ActivityPub I'll be happy to merge it in. But I'd personally like to build support for protocols like Micropub [0] into the backend and our first-party clients [1], as I think that's more suited for regular blogging.

[0] https://indieweb.org/Micropub [1] https://write.as/apps

Sounds good. Thanks for the links!

So is there somewhere I can see what exactly I'd be buying? $1 a month is well within my "definitely worth convenience" margin for migrating my static blog off Github pages, but I can't tell what I'd actually be buying / what the final product would look like?

That lowest plan lets you connect a custom domain and publish to Read.Write.as -- there isn't much more to it that isn't already included in the free plan.

If you want to try out everything on Pro, though, let me know your username [0] and I'll get you on a trial.

[0] https://write.as/contact

This looks awesome!

Does anybody know if there's something similar written in node or python? I'd love to build a similar project, but I'm confused by ActivityPub, and having some source code I can understand as an example would be really helpful.

Learn Go ;-)

No seriously, spend an evening on doing the tour [1] and you won't regret it (all you need is a browser). Actually, the syntax is kinda clean and easy to read. Python might look cleaner at first glance, but it has a lot more tricks you need to learn to understand someone else's code.

Writing Go on the other side is more complicated as you have to learn how to design interfaces properly and there are a lot of common mistakes everybody does in the beginning.

[1]: https://tour.golang.org

Check out Wagtail, Mezzanine, and Pico.

Great suggestions. Thanks for the recommendations. This feed is starting to lay out some really useful context for the next generation of p2p publishing. Btw, here are links to the recommendations: https://wagtail.io http://mezzanine.jupo.org http://picocms.org

I'm looking specifically for ActivityPub examples.

I was looking through the other ActivityPub examples OP mentioned and funkwhale seems to be written in Python (https://code.eliotberriot.com/funkwhale/funkwhale)

Edit: I recommend going through https://github.com/topics/activitypub, have quite a few written in Python.

ActivityPub is nice, but I would also like to see support for RSS and/or Atom. Is that coming?

More generally, linking to a feature list might be useful. I can read the source, but not everyone can.

Syndication is already there; this example from the demo instance might not survive for long, but it works right now: https://pencil.writefree.ly/foo/feed/

Is there an easy way to write Latex (e.g. with MathJax or Katex)? That is for me the most wanted feature of Medium (my intuition is they won't be adding it any time soon).

If it supports inline HTML (not entirely clear to me), then you could try using markdeep[0] to render HTML offline, then copy the output to the editor.

EDIT: just tried, does not work without KaTex being loaded

[0] https://casual-effects.com/markdeep/

And also, is code highlighting supported with colours?

I think the author said elsewhere that it supports MathJax already.

Do you support microformats? I much prefer static content to ActivityPub, and honestly a lot of AP sites are less accessible than ones with RSS or micro formats.

The indie web approach to blogging (h-feed, webmentions, etc.) seems so much better than ActivityPub because it’s static content, web friendly, control of user identity, etc.

Yep, it supports microformats and RSS -- and I'd like to integrate more IndieWeb stuff, like Micropub.

You can also configure the server to not federate your posts if you prefer.

This totally confuses me.

So I am supposed to either sign up for $10 per month or trust somebody from the internet and run their executable on my machine?

Is there anybody here on HN that sees this as viable ways to get into blogging?

We totally need more and better ways to communicate online. But I just cannot see how this has any chance to take off.

It's not $10 bucks a month but $1 or $6. I am a paying customer myself and very happy with the service.

They are generous enough to say that if you don't want to pay them money or have a different idea of what a blog should be, then take their software and make it into whatever you want it to be after inspecting their code.

Don't like that either? You can always come to HN and impugn their motives. Never let a good deed go unpunished.

https://writefreely.org/hosting shows $10/mo and up. I guess the OP would have to find the write.as site instead.

You're right - I interpreted the OP as wanting a single blog. The $10 a month or more is for hosting 250 blogs or more. I would say that's a pretty good deal.

How is the model of "download our open source software or pay us to run it" confusing to you?

If you want to "start blogging", you probably don't want to get a full instance, but more a blog on theirs: https://write.as/pricing

I clicked on 'get started' and then 'hosting plans' on writefreely and got these prices:


Now I see that the prices you mention are linked on the bottom of that page.

Here's the source code: https://github.com/writeas/writefreely

As mentioned, it's an open source project.

> trust somebody from the internet and run their executable on my machine

It’s open source. You can read the source code and compile it yourself.

Applications are open for YC Summer 2019

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact