{"id":21683364,"url":"https://github.com/blairnangle/birthdays","last_synced_at":"2025-03-20T11:22:36.877Z","repository":{"id":203303854,"uuid":"709283634","full_name":"blairnangle/birthdays","owner":"blairnangle","description":"Clojure-powered automated email sender for birthdays and anniversaries.","archived":false,"fork":false,"pushed_at":"2024-01-28T08:42:30.000Z","size":16,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-25T11:41:52.922Z","etag":null,"topics":["clojure","email","hiccup","omniconf","postal"],"latest_commit_sha":null,"homepage":"","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/blairnangle.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-10-24T12:07:38.000Z","updated_at":"2023-10-31T10:17:02.000Z","dependencies_parsed_at":"2023-10-28T18:29:52.486Z","dependency_job_id":"d43a4728-3cb8-4cda-9c3c-1145dfb23b11","html_url":"https://github.com/blairnangle/birthdays","commit_stats":null,"previous_names":["blairnangle/birthdays"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blairnangle%2Fbirthdays","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blairnangle%2Fbirthdays/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blairnangle%2Fbirthdays/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/blairnangle%2Fbirthdays/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/blairnangle","download_url":"https://codeload.github.com/blairnangle/birthdays/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244601300,"owners_count":20479435,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clojure","email","hiccup","omniconf","postal"],"created_at":"2024-11-25T16:11:42.346Z","updated_at":"2025-03-20T11:22:36.855Z","avatar_url":"https://github.com/blairnangle.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# birthdays\n\nClojure-powered automated email sender for birthdays and anniversaries.\n\nWorks with Gmail or Zoho, currently.\n\n## Cloning/forking\n\nOn GitHub, a fork of a public\nrepository [must also be public](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/about-forks):\n\n\u003e A fork is a new repository that shares code and visibility settings with the original “upstream” repository.\n\n(One nice thing about a GitHub fork is that syncing with the original project can be done easily on the GitHub UI.)\n\n*However,* it's probably not a good idea to expose your friends' personal details, so one fairly simple way of making\nuse of this project in a private repo (while maintaining the ability to periodically integrate upstream changes)\nis to create a private fork—see [this Stack Overflow answer](https://stackoverflow.com/a/30352360/4304123) for a\nstep-by-step guide (unfortunately, this means that syncing your repo with upstream changes via GitHub's UI isn't\npossible).\n\n### Example\n\n#### Duplicate the code\n\n```shell\ngit clone --bare https://github.com/blairnangle/birthdays.git\ncd birthdays.git\ngit push --mirror https://github.com/yourname/birthdays-private.git\ncd ..\nrm -rf birthdays.git\n```\n\n#### Get the cloned project on your local machine\n\n```shell\ngit clone https://github.com/yourname/birthdays-private.git\ncd birthdays-private\n[make some changes]\ngit commit\ngit push origin main\n```\n\n#### Sync with upstream (public) changes by creating a new remote\n\n```shell\ngit remote add public https://github.com/blairnangle/birthdays.git\ngit pull public main\ngit push origin main\n```\n\n## Configuration\n\nThis project uses [Omniconf](https://github.com/grammarly/omniconf) to get application-level preferences and secrets\ninto code. See `src/birthdays/config.clj` for a list of config options. Less obvious values are explicitly mentioned\nbelow.\n\nSecret values should find there way into the code as GitHub Actions secrets -\u003e environment variables -\u003e read into config\nby Omniconf.\n\n### :email-provider\n\nIf you use Gmail, this value should be `gmail`. If you use Zoho Mail, this value should be `zoho`.\n\nSave this as a GitHub Actions secret named `EMAIL_PROVIDER`.\n\n### :sender-email\n\nSave this as a GitHub Actions secret named `SENDER_EMAIL`.\n\n### :password\n\nSave this as a GitHub Actions secret named `PASSWORD`.\n\n#### Gmail\n\nYou need a Google App Password to send emails on behalf of your Gmail account. This can be\ndone [here](https://myaccount.google.com/apppasswords).\n\n#### Zoho\n\nIf you have multifactor authentication (MFA) enabled for your Zoho Mail account, you will need to create an\n_Application-Specific Password_ -\nsee [their docs](https://www.zoho.com/mail/help/adminconsole/two-factor-authentication.html#alink7). Even if you don't\nhave MFA enabled, it is still a good idea to create one of these. Otherwise, a bad actor that gets their hands on your\npassword will have access to everything in your account.\n\n### :cc\n\nEmails to cc (can be omitted entirely). Save this as a GitHub Actions secret named `CC`.\n\nFor one cc recipient, e.g.:\n\n```shell\nexport CC=person1@mail.com\n```\n\nFor multiple cc recipients, e.g.:\n\n```shell\nexport CC=person1@mail.com,person2@mail.com\n```\n\n### :footer\n\nGoes at the bottom of every email. Configure in the `config` namespace.\n\n### :input-file\n\nPath to file holding birthdays and anniversaries data. Configure in the `config` namespace.\n\n## Execution\n\n### Locally\n\n```shell\nclojure -M -m birthdays.birthdays\n```\n\n### Remotely\n\nThis program runs at 07:00 UTC daily in a GitHub Actions workflow from the commandline, scheduled by cron.\n\n## License\n\nDistributed under an [MIT License](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblairnangle%2Fbirthdays","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblairnangle%2Fbirthdays","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblairnangle%2Fbirthdays/lists"}