← All projects

Daily Email

Sep 2026 • Solo project

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.

Python AWS Lambda EventBridge SES S3 SAM

Pluggable sections

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.

Daily Digest email with homework, fantasy football, weather, countdown, and quote sections
An example digest with five plugins turned on, rendered with sample data.

How it runs

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.

Settings without redeploying

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.

Settings page with a toggle, reorder arrows, and options for each email section
The generated settings page, with a toggle, reorder arrows, and options for each plugin.

Screenshots use sample data in place of my real accounts.