A year of Org Social, my social network
A year ago I created Org Social. Just a plain-text specification and an .org file served over HTTP. Today it is time to take stock, to see how the project has moved, what has worked and what has not. And above all, to tell the story of a year of development and community.
A bird's-eye view of the whole year would look like this:
2025
- August: the specification is born (Aug 12). Front page of Hacker News and 150 stars in 24 hours. First client,
org-social.el(Aug 16). Spec 1.1: the first external contribution removes:REPLY_URL:. - September: the Relay is born. Groups arrive in the specification.
- October:
org-social.elv2.0 with a redesigned interface (Oct 1). It lands on MELPA (Oct 26). Proposal to the Org Mode list. - November: Relay v1.0 and host is born. A record of 581 posts in a month, probably because the Relay indexed every account. Spec 1.4: boosting posts (
:INCLUDE:) and domain migration (:MIGRATION:). - December: Org Social overtakes twtxt in activity. Spec 1.5: posts visible only to mentioned people (
:VISIBILITY:).
2026
- January: the ID moves into the headline (spec 1.6). A big change that required syncing every piece of software in the ecosystem.
- May: Org Social reaches the App Store (May 11). Spec 1.7 with the
:BOT:property. - July: Planet Emacslife adopts Org Social. The Relay ships bridges to Mastodon and RSS. Webmentions are integrated into the specification.
From the explosion to maturity
The autumn of 2025 was the big explosion.
The specification started moving fast, and a good part of the credit goes to proposals from outside. In version 1.1 (that same August 16) I removed the separation between * Posts and the first **, and dropped the :REPLY_URL: property. That change was pushed by @confusedalex: a stranger who showed up, pointed out it was unnecessary, and was right. Nothing validates an idea more than a stranger opening an issue to improve it.
From there, the specification kept growing with judgment:
- 1.2: the avatar now had to be at least 128x128 in JPG or PNG.
- 1.3:
:MOOD:(reactions) and:GROUP:(groups) arrived. Groups were added on September 20. - 1.4:
:INCLUDE:to share other people's posts (the classic boost) and:MIGRATION:to announce a domain change. - 1.5:
:VISIBILITY:with the valuemention, for posts only mentioned people can see.
And while the specification grew, so did the ecosystem. Org Social stopped being a file and became a constellation of programs.
Even before the Relay existed, discovering people was a manual affair: a registers.txt file in the repository where people signed up by hand. It reached 17 active users.
The Relay was born on September 5 and hit its v1.0 on November 1. It is the piece that indexes users, mentions, replies, groups and threads across the whole network, so a client can discover new people and find out that a stranger has mentioned you. It retired registers.txt and surfaced a bunch of new accounts that were there but nobody could see.
On October 26, with version 2.3, org-social.el landed on MELPA. That is the moment the Emacs client became truly stable.
The Emacs client I had to rewrite from scratch
Getting to that stable client was not free. It was my big headache.
The first version of org-social.el I wrote in August, quickly, to prove the idea worked. A single file that grew commit by commit: reading feeds, painting the timeline, replying, polls. It worked. But inside it was a snowball. The logic and the interface were tangled together, everything lived in the same place, and every new feature was a fight. When I tried to add threads, groups, notifications and real time, I hit a wall: the architecture could not take any more.
With everything I had learned, I rewrote it. On October 1, 2025 I announced the second version, org-social.el v2.0, with a completely redesigned interface and "the biggest update yet". It changed more than 4,600 lines at once. I split the monolith into modules: the parser on one side, the feeds on another, the interface in its own ui/ folder divided into buffers (timeline, thread, profile, groups, search, discover, notifications), the Relay, the real time, the validator, and more. And there I had to apply several optimization strategies to avoid freezes while Emacs processed feeds or subfeeds. The rewrite was a long and painful birth, but it was worth it.
During the process I found a bug in Org Mode itself.
Every Org Social post needs a unique identifier. The original decision, made in the early days, was to use an ISO 8601 timestamp inside the properties drawer. A post looked like this.
**
:PROPERTIES:
:ID: 2025-05-01T12:00:00+0100
:END:
This is my post.
See that empty headline, the ** followed by nothing? Well, it is not empty: it must carry a space after it, even though Org Mode's documentation does not say so and is ambiguous. An empty level-two headline needs that trailing space to be valid syntax. Without the space, ** stops being a headline. The problem is that a lot of people (myself included) have delete-trailing-whitespace enabled on save, an Emacs command that removes trailing spaces at the end of each line. It is a universally good practice. And it silently wrecked all your posts.
I reported it and contributed a patch, but it was not accepted for backwards-compatibility reasons. Still, the discussion was very interesting.
I was forced to ship a fix in version 1.6, on January 4, 2026. I moved the ID into the headline.
** 2025-05-01T12:00:00+0100
This is my post.
Now the identifier lives where nothing can erase it.
In May 2026 I marked the old format as legacy. It is still valid for compatibility, but I recommend the new one and I document the trailing-space trap for anyone who runs into it. I took the chance in that version to also bring in :LOCATION:, :BIRTHDAY:, :LANGUAGE: and :PINNED:.
During these months I wrote several articles around the project: Why Org Social is the ethical Fediverse alternative, where I defend the project without hiding its limits, and Quick tutorial to get a blog online from Org mode thanks to Org Social, where I use the ecosystem to publish a blog with no server.
With the specification settled and the client mature, the same old pending task remained: making it easy for anyone to start, Emacs users or not.
iOS and host: finally an easy way in
On November 18, 2025 host was born, the hosting service for your social.org with an automatic nick and public URL, very much in tune with the Tilde philosophy. Not everyone has a server to upload a file to, and this solved that at the root. It also opened the door to native clients, since it let you sync your social.org from any device.
To communicate, most of us use the smartphone far more than the desktop. A native iOS client broke that barrier.
On May 11, 2026 the app reached the App Store. For the first time you could carry your decentralized social network in your pocket, with the interface anyone who has touched a phone expects: posts, replies, threads, polls, groups, scheduled posts and feed export. And all of it with no analytics, no tracking, no telemetry, no third-party SDKs.
The combination of host and the iOS app made Org Social accessible.
The flow became as simple as this:
- You sign up to host from your phone. Behind the scenes, host gives you a nick and a public URL.
- You write in the iOS client and save. The client uploads your
social.orgto host.
Transparent and frictionless.
Of course, this is also compatible with the Emacs client, and it is bidirectional: you can write in Emacs and carry on in iOS, or the other way around.
On April 21, 2026 I published a tiny post, "writing from iOS", from a test build of the app. Seeing it show up in the timeline, coming from an iPhone and not from an Emacs buffer, was one of those moments when a project crosses a line.
In May the app got custom themes and push notifications, and with that I called it done. It went into maintenance mode. Not all software has to grow forever.
That same month version 1.7 of the specification arrived with the :BOT: property, to mark posts generated by bots without cluttering anyone's timeline. With it, for example, you can play a game of chess against a bot from Org Social.
And the year brought signs of maturity. The Relay shipped bridges to follow Mastodon (ActivityPub) accounts and RSS/Atom feeds from any Org Social client, as if they were just more users. A bit later Webmentions were integrated, so that when you link to someone's article they get notified.
Org Social is starting to talk to the rest of the web, not just to itself.
The present
A year later, where do we stand?
The picture of the community is that of a niche project, healthy and stable.
The numbers:
| Metric | Total |
|---|---|
| Registered accounts | 267 |
| Indexed feeds | 236 |
| Posts | 2,392 |
| Follows | 1,274 |
| Active groups | 5 |
It stays steady at around 19 active accounts a month. Not millions, and it never will be. It is a small community that is still there, month after month.
The specification is at 1.7, though I do not think a new version will come out, at least not in the short term. It feels finished to me.
The official ecosystem is already a dozen pieces:
- org-social: the specification, the founding document.
- org-social.el: the Emacs client, today at version 2.14 and beyond.
- relay: the P2P server that indexes the network.
- host: hosting for your
social.orgwith an automatic nick. - OrgSocialKit / ios: native library and client for iOS and macOS in Swift, available on the App Store.
- live-preview and static-preview: social-media-style preview cards for post URLs.
- web-reading: a web timeline viewer, for those who don't use Emacs.
- push: push notifications for the iOS app.
- rss-bridge: turns any RSS/Atom feed into Org Social format, so you can follow whatever you want.
- awesome: the curated list of clients, relays, libraries and tools.
The important stuff already exists.
The future
I would love a client for Android and one for the terminal. Neither is trivial nor impossible.
It would also make sense to extend host so it could hold multimedia content, like images and videos. I am still thinking about it.
What I do want is to improve the funding. Each Relay is a node in the network: the more there are, the more robust it becomes. And Apple's developer account does not pay for itself. If you like the project, consider making a donation.
And if you have made it this far, you could leave a comment on your social.org by following this tutorial.
See you in the timeline!
- From the explosion to maturity
- The Emacs client I had to rewrite from scratch
- iOS and host: finally an easy way in
- The present
- The future
This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.
Help me keep writing
Every coffee gives me a push toward the next article.
Sure, it's on me!
Comments
There are no comments yet.