A framework for a personalized daily email. Each section of the email is a small plugin that pulls from one source (an API, a calendar, a feed) and renders its piece of the email. A scheduled job runs whichever plugins are turned on and sends one combined digest.
Each section is a plugin: one Python file with a run(options, today) function that fetches
whatever it needs and returns an HTML snippet. The digest doesn't know anything about what a plugin does,
so the email can hold any mix of sources.
The plugins I run today are homework from Canvas, fantasy football lineup alerts from Sleeper, the weather, countdowns, and a daily quote. The example below shows that setup.
An EventBridge schedule triggers a Python Lambda function every morning. The function loads the current
config, runs each enabled plugin in order, puts their HTML into one email template, and sends it through SES.
The whole stack is defined in an AWS SAM template, so deploying is sam build && sam deploy.
Each run is independent of which plugins exist: the function reads the list of enabled plugins from the config at send time, so turning a section on or off never needs a redeploy.
Every email ends with a link to a settings page, served by a second Lambda function through a function URL. From there you can turn sections on and off, reorder them, change their options, or send a test email right away. Each plugin declares its own settings fields, and the form is generated from them, so a new plugin gets a settings UI for free.
Screenshots use sample data in place of my real accounts.