{"id":16778481,"url":"https://github.com/kaarthik108/snowsend","last_synced_at":"2025-04-10T20:43:34.234Z","repository":{"id":186689551,"uuid":"669442253","full_name":"kaarthik108/snowSend","owner":"kaarthik108","description":"snowSend - Dynamic Emails Snowflake","archived":false,"fork":false,"pushed_at":"2024-03-23T00:59:11.000Z","size":401,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-24T18:13:03.171Z","etag":null,"topics":["aws-lambda","email","pulumi","react-email","resend","snowflake"],"latest_commit_sha":null,"homepage":"https://medium.com/@kaarthikandavar/snowsend-powering-dynamic-emails-through-snowflake-in-realtime-856d526a45f3","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kaarthik108.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"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},"funding":{"github":["kaarthik108"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":"kaarthik_k1"}},"created_at":"2023-07-22T09:41:28.000Z","updated_at":"2024-04-19T21:51:37.000Z","dependencies_parsed_at":null,"dependency_job_id":"6a1307b2-8193-4193-9d8b-d94e079b1bb8","html_url":"https://github.com/kaarthik108/snowSend","commit_stats":null,"previous_names":["kaarthik108/snowsend"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaarthik108%2FsnowSend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaarthik108%2FsnowSend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaarthik108%2FsnowSend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaarthik108%2FsnowSend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kaarthik108","download_url":"https://codeload.github.com/kaarthik108/snowSend/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248294012,"owners_count":21079765,"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":["aws-lambda","email","pulumi","react-email","resend","snowflake"],"created_at":"2024-10-13T07:27:48.809Z","updated_at":"2025-04-10T20:43:34.213Z","avatar_url":"https://github.com/kaarthik108.png","language":"TypeScript","funding_links":["https://github.com/sponsors/kaarthik108","https://buymeacoffee.com/kaarthik_k1"],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003esnowSend 📯\u003c/h1\u003e\n\n**snowSend** is an open-source prototype that empowers you to dispatch custom-styled emails directly from Snowflake. React to real-time triggers and provide a unique experience with emails stylized using React-Email components.\n\n![pika-1691483278303-1x](https://github.com/kaarthik108/snowSend/assets/53030784/bb243030-cfe0-4780-b72e-8108071b068d)\n\n\n## ⚙️ Tech Stack\n\n- **Snowflake** - API Integration, External Functions\n- **AWS** - API Gateway, Lambda\n- **Infrastructure as Code (IAC)** - Pulumi\n- **Email** - Resend Labs\n\n## ✨ Features\n\n- **Custom Styled Emails**: Generate beautiful emails with the help of React-Email components and Tailwind CSS.\n- **Real-time Triggers**: Deliver emails in response to real-time events from your Snowflake data warehouse.\n- **Rapid Setup**: Get up and running in minutes. Complete infrastructure setup using Pulumi on both AWS \u0026 Snowflake.\n- **Data Privacy**: Your data never leaves Snowflake, ensuring optimal privacy.\n- **Integrated with Resend Labs**: Provides seamless integration with Resend Labs as an email service provider.\n\n## ⨠ Installation\n\nFollow these steps to get **snowSend** up and running in your environment.\n\n1. **Clone the repository**\n\n    ```bash\n    git clone https://github.com/kaarthik108/snowSend.git\n    ```\n\n2. **Set up a Resend account**\n\n    Sign up on Resend and retrieve the API Key:\n\n    ```bash\n    cd pulumi\n    npm i\n    pulumi config set RESEND_API_KEY your_resend_api_key --secret\n    ```\n\n3. **Pulumi setup**\n\n    - Navigate to the `pulumi` directory, edit `Pulumi.prod.yaml` add the config values, use the below command\n    to set for all other configs\n\n    ```bash\n    pulumi config set snowflake:password your_password --secret\n    ```\n\n    - Install npm packages and check the email components:\n\n    ```bash\n    cd pulumi/app\n    npm install\n    npm run dev\n    ```\n\n    - Install packages and provision all resources needed in AWS and Snowflake:\n\n    ```bash\n    cd ..\n    npm install\n    pulumi up\n    ```\n\n    - Configure `API_AWS_EXTERNAL_ID` and `API_AWS_IAM_USER_ARN` values (you will get these values once you run pulumi up from previous step as stack output):\n\n    ```bash\n    pulumi config set API_AWS_EXTERNAL_ID $(pulumi stack output API_AWS_EXTERNAL_ID) --secret\n    pulumi config set API_AWS_IAM_USER_ARN $(pulumi stack output API_AWS_IAM_USER_ARN) --secret\n    pulumi up\n    ```\n\n4. **Deploy translator function** (manual step for now)\n\n    This step is necessary due to an issue with snowflake when deploying the request translator UDF, as pulumi deploys functions with quotes eg: \"snowsend-1234\", but when you set that as REQUEST_TRANSLATOR in external function they don't register as quotes, which makes the external function to not able to find the UDF. So we do this step manually for now.\n\n    ```bash\n    cd ..\n    pip install -r requirements.txt\n    python test.py\n    ```\n\nRemember to replace the values in `test.py` with your function names (`EXTERNAL_FUNC` and `TRANSLATOR_UDF`).\n\nAdditionally, you can host your images either in s3 or snowflake. set `pulumi config set url https://s3:xyz/s3.amazonaws.com` if you have images in s3\n\n## 🤝 Contributing\n\nYour contributions are always welcome! Here's how:\n\n- [Report a bug](https://github.com/kaarthik108/snowSend/issues) if you encounter one.\n- Submit a [Pull Request](https://github.com/kaarthik108/snowSend/pulls) to help us improve the project.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaarthik108%2Fsnowsend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkaarthik108%2Fsnowsend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaarthik108%2Fsnowsend/lists"}