The webapp running Rainey Arcade is called "Muffin Shop". It began as an ecommerce site for a local farm (which is still the primary focus). I made the shop part of the webapp into a separate "module" that is loaded by a JSON config file, with the idea being that I could reuse the "core" bits in future sites that may not be shops.
The shop module supports two payment processors: Stripe for real payments, and the "Arcade" payment processor that uses virtual arcade tokens. The shop module uses different Payment Adapters to convert the payment processors' interfaces into a standard that can be used by the shop module. The Arcade Payment Adapter simply redirects the user to the arcade module to complete the transaction, while the Stripe Payment Adapter mutates the cart data to match Stripe's API before redirecting the user off-site.
I'm working on a third instance of Muffin Shop now: one which will not use the shop module at all. It's an artist's portfolio, so the main module is going to be a gallery. There's an image-uploading system built into the core, which is used to upload images of products to the shop module. The gallery module will use the same uploading system and same image carousels as the shop module; it should be a very small module thanks to all the shared functionality.
This new instance will also have a newsfeed. The blog module I created for Rainey Arcade simply takes posts from JSON files which are generated by a cron job that checks my Mastodon. But I can easily add more routes to the blog module that would allow for manually adding and editing posts, and turn it into a simple newsfeed.
Although the artist's portfolio doesn't use the shop module, I think it shares enough functionality to make sense as an instance of "Muffin Shop". The config will disable a lot of stuff but that's fine. I want to make my artist friend a new website 🙂