We can't find the internet
Attempting to reconnect
Something went wrong!
Attempting to reconnect
Publishing to the Atmosphere
After a few months of respite, fatigued by AI coding, I've regained my enthusiasm for working on AlchemyPub, the blogging and web engine running this site. It was mainly fueled by the upcoming Goatmire conference and the talk I prepared for it. The most recent outcome is an integration with Bluesky (and of course Eurosky) and the ATproto ecosystem, lovingly called the Atmosphere.
AlchemyPub
The way I originally built it, AlchemyPub was designed for operational simplicity. I wanted to host my own website, but none of the existing solutions made me happy, so I build it from scratch. It is a simple Phoenix LiveView application, that is reading plain text files and images as the only data source. It doesn't require a database (although I store anonymized tracking data in SQLite). The whole structure of the site and all content is generated from Markdown and a few lines of Frontmatter, similar to a static site generator like jekyll. A file watcher looks for changes in the source folder and rebuilds content immediately on change, pushing updates to all connected clients. For performance, the compiled pages are stored in ETS, so a page request does not require disk access.
Because of these constraints, the web application including its content can be versioned in my private git instance, deployed through a simple pull, and there is no need to do any backups or separate versioning of the content, as it would be in a database-backed CMS. Content can be written and changed with a simple text editor, even directly via SSH on the server.
Social protocols
So far, the only way to somewhat integrate with social networks was the RSS feed AlchemyPub provides. It is a machine-readable file that lists all articles, similar to the menu, and can be checked regularly by subscribers. It is meant to be consumed by other applications and web services like glean (not gleam, the programming language) and informs subscribed readers about new publications.
Since the X-odus, Bluesky has become my go-to social platform. Not only are there lots of pleasant people active, it also has a very interesting technical foundation. The underlying AT Protocol can do much more than cloning Twitter. It is nourishing a whole app ecosystem, and I enjoy browsing and posting to photography communities on grain and zeens as well.
All data in those App Views is easy to access without authentication, so it can be embedded in other web apps too. This is the first new thing I did with AlchemyPub, allowing any Bluesky thread to be attached to a blog post. When you scroll down to the bottom of the page, you can see the skeet I created to announce this article.
Standard.site
Another schema shared by many apps on ATproto is standard.site. It is comparable with RSS, but instead of a pull-mechanism, you can actually push new publications to your PDS, from where they get distributed to the firehose. This makes discovery of new blogs and publications a lot easier, as it allows ingesting, searching and sharing all standard.site publications on the net, globally. Less than 4 months ago, Bluesky honored this standard with an improved presentation (which mostly looks like a marketing trick, but it seems to work on me 😉).
Because the AlchemyPub server already had a mechanism to recognize and push changes made in the underlying data, it was almost trivial to hook up a standard.site publisher, too. Just deposit an ATproto handle and app password in the server config, and all new articles you write will be synced to your PDS by another GenServer within the application. Elixir has turned out to be the most brilliant solution to run a web application, again. I'll be looking forward to exploring a new distribution channel for my writing, and with Bluesky integration, there's an even nicer way to receive feedback besides someone sending me a (digital) letter.
Conclusion
I love how well this integration works without any ceremony or the need to store additional data (besides some caching in ETS), adding lots of value to AlchemyPub with little effort. I can basically use ATproto and the PDS as my globally distributed (public) database, the database I always wanted to avoid maintaining. I'm excited about getting even more utility from this symbiosis in the future, without locking myself in to a commercial platform, service or Enshittification provider.
The source code of AlchemyPub is available on tangled freely under the GPLv3 license, and can be run on any machine with access to a BEAM or by simply doing a fly deploy. Feel free to give it a try, join the Atmosphere and leave a comment on Bluesky.