Indus Reminder is a production-ready Go CLI automation tool that sends a daily reminder email through Gmail SMTP to ensure work trackers and personal checklists are updated consistently.
Teams and individuals often forget end-of-day hygiene tasks (tracker updates, blockers, and personal follow-ups). This project enforces a reliable reminder cadence with a deterministic GitHub Actions schedule.
- GitHub Actions triggers the job at a UTC cron time mapped to local 16:30.
- The CLI loads
checklist.mdfrom the repository. - SMTP credentials and recipient are read from environment variables.
- The CLI sends a styled tricolour email via Gmail SMTP with a warm message and inline visual layout.
- Sundays are skipped both by cron (
1-6) and by runtime guard. - Manual
workflow_dispatchsupportsforce_send=truefor Sunday-only delivery testing. - Every
pushevent runs a deployment test that sends 3 emails, 1 minute apart.
- Local timezone used:
Asia/Kolkata(UTC+05:30) - Target local send time:
16:30 - Workflow cron:
0 11 * * 1-6 - Conversion:
11:00 UTC + 05:30 = 16:30 IST - Sunday skip: Cron runs Monday-Saturday only (
1-6), and the binary also exits early on local Sunday.
- Trigger: every GitHub
pushevent. - Behavior: sends 3 test emails with subjects
Deployment Test 1/3,2/3,3/3. - Interval: 1 minute between each email.
- Sunday handling: deployment tests force-send (
FORCE_SEND=true) so testing works any day. - Daily reminder behavior remains unchanged for Monday-Saturday at 16:30 IST.
These must be provided at runtime (typically GitHub Secrets):
SMTP_HOSTSMTP_PORTSMTP_USERSMTP_PASSMAIL_TO
Optional:
MAIL_SUBJECT(falls back to default subject if empty)MAIL_FROM(header sender email shown in inbox, defaultSMTP_USER)MAIL_FROM_NAME(header sender name, defaultIndus Software Reminder)REMINDER_NAME(defaultBoss Hari)REMINDER_TZ(defaultAsia/Kolkata)CHECKLIST_FILE(defaultchecklist.md)FORCE_SEND(defaultfalse, intended for manual Sunday testing)
- Fork this repository.
- Add repository secrets:
SMTP_HOST=smtp.gmail.comSMTP_PORT=587SMTP_USER= your Gmail addressSMTP_PASS= Gmail App PasswordMAIL_TO= recipient email address
- Optionally add repository variables
MAIL_SUBJECT,MAIL_FROM,MAIL_FROM_NAME, andREMINDER_NAME. - Enable Actions in your fork.
- Run workflow manually once using
workflow_dispatchto validate configuration. - If testing on Sunday, run manual dispatch with input
force_send=true.
go test ./...
go build ./cmd/indus-reminderThe binary is designed to run in GitHub Actions and returns an error if executed outside that environment.
.
|-- cmd/indus-reminder/main.go
|-- internal/mailer/mailer.go
|-- internal/mailer/mailer_test.go
|-- internal/emailtemplate/template.go
|-- internal/emailtemplate/template_test.go
|-- checklist.md
|-- .github/workflows/reminder.yml
|-- docs/diagrams/
|-- docs/email-assets/
|-- README.md
|-- LICENSE
`-- .gitignore
The reminder email uses an inline tricolour layout (no external image loading required in the email body). The SVG files below are design references kept in the repository:
High-level view of scheduler, CLI, checklist source, SMTP, and recipient.
Shows scheduled trigger, build stage, run stage, and failure behavior.
End-to-end call sequence from scheduler to SMTP delivery.
Static component relationships inside the Go project.
Execution topology of GitHub-hosted runner and external SMTP endpoint.
How configuration and checklist data move through the system.
Package-level dependency direction and boundaries.
- GitHub scheduled workflows are best-effort and can be delayed by a few minutes.
- Cron is always evaluated in UTC.
- Gmail SMTP requires App Password when 2FA is enabled.
- This tool intentionally has no retry queue or persistent state.
- Push deployment tests send 3 emails per push and can increase mailbox volume.
- No secrets are hardcoded in source, workflow, or documentation.
- SMTP credentials are loaded only from environment variables.
- Logs avoid printing passwords or secret values.
- Gmail SMTP still authenticates with
SMTP_USER/SMTP_PASS;MAIL_FROMandMAIL_FROM_NAMEonly control display headers.
MIT License. See LICENSE.