No description
  • Python 86.6%
  • HTML 5.3%
  • CSS 3.9%
  • JavaScript 3.8%
  • Dockerfile 0.4%
Find a file
2026-02-18 10:28:27 -06:00
.forgejo update workflows 2026-02-18 10:28:27 -06:00
.vscode Migrate from github to self-hosted forgejo 2026-02-17 23:44:35 -06:00
src fix #168, update to new Todoist API 2026-02-18 00:32:22 -06:00
static fix #155 and fix #158 2025-05-02 10:31:10 -05:00
templates fix #144, fix #127 2025-01-05 15:53:37 -08:00
.env.example fix #144, fix #127 2025-01-05 15:53:37 -08:00
.gitignore update .gitignore to ignore .DS_Store 2026-02-17 16:58:15 -06:00
docker-compose.yml update renovate.json and docker-compose.yml 2026-02-18 09:50:05 -06:00
Dockerfile Pin dependencies 2026-02-18 05:59:49 +00:00
LICENSE fix #169 2026-02-18 00:10:49 -06:00
README.md edit workflow and README.md 2026-02-18 10:11:42 -06:00
renovate.json update renovate.json and docker-compose.yml 2026-02-18 09:50:05 -06:00
requirements.txt fix #196 2026-02-18 07:57:35 -06:00
SECURITY.md Create SECURITY.md 2024-11-05 12:55:53 -06:00
version.json bump version 2026-02-18 08:03:40 -06:00

Daily Summary Email

Last commit Open issues Open PR's

Summary

A program that emails the user the weather, any tasks on their to-do list, their events, puzzles, a word of the day, a quote of the day, and more at a designated time daily. (Only Todoist and Vikunja are currently supported, but am open to adding more. Feel free to request any todo app with an issue.)

To change the time of day that the email is sent, use the MINUTE and HOUR environment variables. All times should be in 24hr (0-23 for hours, 0-59 for minutes) time.

At any time, you may trigger an email send through the Web UI.

If you have any specific questions or issues setting it up, please feel free to email me at coding@tydavis.dev. While I will try my best to respond quickly, I can make no guarantees on time nor a guaranteed solution, but I will try my best.

Please note, I am a novice developer and LLM's were consulted for some of the inner workings (namely calendar parsing and the web UI).

Setup

Run this in Docker, using the provided docker-compose.yml. Use the .env.example as a guideline for the .env file, however, all these options are not necessary to put in the .env file, they can be added later in the web UI. The only necessary variables to set are the ENCRYPTION_KEY and PASSWORD. The set PASSWORD is used to log into the web UI. If you initially use env vars to fill out all the data, you may remove them after the first run as long as there is a config.json location configured (./data in docker-compose.yml).

The package tagged latest contains the latest stable release, while the package tagged latest-dev contains the latest development release, ignoring all stable releases.

Environment Variables

See .env.example for an example .env file.

  • RECIPIENT_EMAIL: The recipient's email
  • RECIPIENT_NAME: The name that the email is addressed to
  • SENDER_EMAIL: The sending email
  • SMTP_USERNAME: The username of the sending account on the SMTP server
  • SMTP_PASSWORD: The password of the sending account on the SMTP server
  • SMTP_HOST: The host of the SMTP server (e.g. smtp.gmail.com)
  • SMTP_PORT: The port of the SMTP server (defaults to 465 for SSL) [Currently only 465 is supported]
  • OPENAI_API_KEY: Your OpenAI API key. Used to generate a short summary of the email.
  • ENABLE_SUMMARY: True or False. Toggle for if a summary should be generated. (defaults to true)
  • UNIT_SYSTEM: METRIC or IMPERIAL. (defaults to metric)
  • TIME_SYSTEM: 24HR or 12HR. (defaults to 24HR)
  • LATITUDE: The latitude you wish to use for the weather and timezone.
  • LONGITUDE: The longitude you wish to use for the weather and timezone.
  • ADDRESS: The address of which the weather and timezone should be used. (Use quotes)
  • WEATHER: True or False. Enables weather. (defaults to false)
  • TODOIST_API_KEY: Your Todoist API key
  • VIKUNJA_API_KEY: Your Vikunja API key VIKUNJA_BASE_URL: Your Vikunja base url
  • WEBCAL_LINKS: Link(s) for webcal or ics calendars of which the events should appear in the email. Use one string, seperated by commas. Do not use quotes.
  • RSS_LINKS: Link(s) for rss feeds of which the entries should appear in the email. Use one string, seperated by commas. Do not use quotes.
  • PUZZLES: True or False. Enables puzzles. (defaults to false)
  • PUZZLES_ANSWERS: True or False. Enables puzzle answers. Overridden by False on PUZZLES. (defaults to false)
  • WOTD: True or False. Enables the Word of the Day. (defaults to false)
  • QOTD: True or False. Enables the Quote of the Day. (defaults to false)
  • HOUR: The hour to send the email. (defaults to the time when the container started)
  • MINUTE: The minute to send the email. (defaults to the time when the container started)
  • TIMEZONE: Timezone as a string. (not required if a latitude and longitude or an address are given, but will override that timezone. Ensure that it is spelt correctly.)
  • LOGGING_LEVEL: Level for logging (defaults to INFO). Options: 'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'.
  • ENCRYPTION_KEY: Fernet encryption key for passwords and API keys. One way to generate them could be python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
  • PASSWORD: Web UI password. Must be alphanumerical.
  • SECRET_KEY: Random alphanumerical string. Used for session cookies of the Web UI.

NOTE: You MUST provide either a coordinate pair or an address.

OpenAI Integration

The OpenAI Integration allows a 2-3 sentence summary of the email near the top.

Under the current API pricing (last updated February 18, 2026), this integration costs about $0.104025 USD per year of operation, with very long emails (1250+170 input tokens per day, a maximum of 120 tokens of output per day). The output is limited at 120 tokens per day. The model used is GPT-4o mini, which allows for it to cost much less than a larger model. The current pricing is $0.150 / 1M input tokens and $0.600 / 1M output tokens.

Cost Breakdown

\text{Total Input Tokens per Year: } 1,420 \text{ tokens/day} \times 365 \text{ days} = 518,300 \text{ tokens}

\text{Total Output Tokens per Year: } 120 \text{ tokens/day} \times 365 \text{ days} = 43,800 \text{ tokens}

\text{Total Input Cost} = \frac{518,300}{1,000,000}\times0.150 = 0.077745 \text{ USD per year}

\text{Total Output Cost} = \frac{43,800}{1,000,000}\times0.600 = 0.02628 \text{ USD per year}

0.077745+0.02628=0.104025 \text{ USD per year}

Setup Instructions

To set this up, make an account with OpenAI, or log in with one, and get your API key. Note: The OpenAI API is a different product that ChatGPT, ChatGPT Plus does not grant access to the OpenAI API.

Attribution

Other Notes

  • Versioning follows semver.
  • If you want news articles, add their RSS feed as a feed. For example, the Wall Street Journal supplies RSS feeds, and other newspapers likely do too (WSJ World News Feed).
    • I do not claim responsibility for any content in this feed. I do not support any particular news paper, nor wish to make any political comments on any work. This feed was choosen because it was shown to be close to the center of the political spectrum.