- Supports tags, full text search, photos, videos, audio files, reviews, private posts (mostly just for drafts), content warnings, simple realtime notifications (only "this page has changed, refresh it").
- Supports only micropub for posting, updating, deleting and undeleting, no custom endpoints.
- Includes micro-panel, a micropub-based admin panel.
Sweetroll consists of:
- a "backend" service written in Haskell that's (roughly) responsible for getting data into the database: auth, micropub, receiving webmentions;
- a PostgreSQL database (mf2sql schema created for Sweetroll) that's used for storage, full text search and change notifications (LISTEN/NOTIFY).
- a web server that proxies requests to both services (configuration is provided for nginx).
Pretty much everything in Sweetroll is represented as microformats2 JSON objects, including feed configurations and site settings. (Of course there's no common microformats for that, so it's custom, but stored in the same way.) Stored procedures are used to extract embedded entries (comments, in-reply-to contexts, etc.) into their own records when writing content and to embed them back when reading. And to build feeds.
This data-driven feed construction allows the engine to know exactly which feeds would be affected by an entry creation/change. So when an entry is updated, the frontend app would determine that it affected e.g. the home feed, the articles feed and tag feeds for #sweetroll and #web. So the WebSub hub would receive a notification for all these feeds, and browsers currently open to these pages would receive a "reload this" box →
The following Haskell libraries were written for Sweetroll:
- a small Dropwizard-like Haskell "framework" based on Servant
- a parser for the HTTP Link header
- a parser for Microformats 2
- implementations of indieweb algorithms like authorship
- a usable PCRE based regular expressions library
No longer used: