Architecture

External Integrations

Third-party services the platform depends on, grouped by purpose. Most are called from the API or worker; a few are used directly by the public website.

Storage & media

Amazon S3
Image and asset uploads. Configured via S3_BUCKET, S3_REGION, AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY. Used through aws-sdk in the API.

Email & deliverability

ServiceRoleWhere
SendGridTransactional emailAPI services/sendGrid.js (SENDGRID_API_KEY)
AWS SESEmail transportAPI via nodemailer-ses-transport
OngageEmail marketing / ESP orchestrationAPI services/ongage.js (ONGAGE_* credentials, list & field IDs)
Fresh AddressEmail address validation / hygieneAPI (FRESH_ADDRESS_API)

Newsletter rendering uses Handlebars, Foundation for Emails (Inky), Juice, and related inlining libraries inside the API before handing off to a transport.

Operations & monitoring

ServiceRoleWhere
SentryError & performance monitoringAPI instrument.js (@sentry/node, profiling); initialized at startup
Monday.comOps / workflow integrationAPI services/monday.js

Anti-abuse / CAPTCHA

Multiple CAPTCHA providers are configured (the active one has changed over time):

Used directly by the public website

ServiceRoleWhere
AccuWeather5-day forecast embedded in newslettersweb2/email_templates/dynamic-newsletter.php (calls dataservice.accuweather.com)
Google AnalyticsPageview analytics (UA + GA4 tags)web2/includes/footer-analytics.php
Planned / future
Google Gemini is scaffolded in web2/settings.php (an empty $gemini_apiKey) for a planned events-page chatbot ("Yodel"), but it is currently disabled — the chatbot include is commented out and the script file is absent. Treat it as a future integration, not a live dependency.
Being decommissioned: Matomo
A self-hosted Matomo (Piwik) analytics server at analytics.macaronikid.com historically received public-site pageview tracking and powered one admin dashboard widget. It is being retired; nothing load-bearing depends on it. See Analytics Decommission for the full plan and current status.