I returned back to Internet’s roots, to a personal web server.
Back to the basics from the world of centralized, controlled and censored platforms.
Decision
Instead of running Mastodon, or any of alternative ActivityPub servers, I elected to stand up (again) my own personal web site. Requirements are: control, simplicity and ability to integrate with ActivityPub and other future open protocols.
How I got here
I used to rely on Facebook, but almost two years ago “moved out” due to censorship and partisan nature of algorithms. I still maintain an account, I participate in groups related to my interests, but no longer share my own content there.
Between “move out” and “now”, I on-boarded ActivityPub (fediverse). It is a viable alternative as it is federated, it is decentralized and there is no mechanism for censorship. The feature set is sufficient, but one still needs to rely on an instance server or run one’s own.
Implementation
Simplicity: Nginx + Hugo for a static web site.
Nginx is extremely resource efficient and performant in serving static content, reverse proxy-ing (to application web servers), and has excellent track record.
If I ever need to generate content dynamically at serving time, a purpose application server API via js will do the job via Nginx.
Content is handled by Hugo - a static site compiler. My instance uses a heavily customized ananke theme. Hugo handles content resizing, cross linking, indexing, taxonomies, content cards, RSS and uses Markdown for content.
Writing a blog post is as simple as dropping a Markdown file into a new
directory along with a few images and running $> make install
.
Interoperability: HTTPS + RSS + Previews + API-push
Blogs using HTTPS and RSS are a well established approach to sharing one’s content. Hugo handles RSS generation out of the box.
Similarly, when an URL is shared, web sites will utilize one of:
- OpenGraph metadata
- Twitter_Card metadata
- Schema_Itemprop metadata
to produce Previews of the shared URL. Hugo provides all of them.
To automatically share my content via ActivityPub, I’m relying on Previews and Mastodon API to write a daemon to push my new RSS feed content into my ActivityPub account.
Open Issues
Comments are hard. They require buy-in into shared infrastructure for authentication to prevent spam and to build relationships.
This is to say, I’m not actively trying to solve this problem on my web site. Instead, I’m relying on my API-push process and comments on ActivityPub as the primary mechanism for interacting.
Users not on ActivityPub can send me a comment email by clicking on unique link on the bottom of every content page.
As I already read my ActivityPub stream and my emails, I consider the comments “solved enough” 😄
Ownership / Summary
In above approach, the personal web page remains the source of content, is under my ownership, it is low overhead and it automatically propagates to followers. It is accessible to anyone with web browser, RSS reader or ActivityPub client.