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.
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.
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).
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 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.
> 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?
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.
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!
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.
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.
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?
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."
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.
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.
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.
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.
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.
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!
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.
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.
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?
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?)
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.
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.
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.
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.
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).
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.
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.
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.
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.
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.iohttp://mezzanine.jupo.orghttp://picocms.org
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
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.
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.
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.
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.