G-Notify
GDSC Lead. Twenty offer emails. Gmail's client would not send HTML. Nodemailer felt like cheating, or at least like not learning GAPIs. He wrote a mailer, then a product, then a landing page, then a blog post about fighting Nuxt SSG on Netlify the night before a DBMS exam. The origin story is recruiting. The stack is spite plus googleapis.
G-Notify is a mass HTML emailer. Nuxt on the front, Express on the back, Gmail API in the middle, no nodemailer. Templates are created, uploaded, and sent one-to-one or in bulk. Handlebars renders them. MIME is assembled in process. Mongo stores the records. Google Cloud Storage holds assets. Tracking exists; stats were the honest unchecked box.
- github.com/iresharma/G-Notify
- github.com/iresharma/g-notify-landing
- WatchIreshStruggle — Nuxt on Netlify
Why it exists
The LinkedIn writeup is the spec. As GDSC Lead he had a core team to notify and did not want twenty manual emails. Gmail would not send HTML. A Python script with Jinja and the Gmail API proved the path. The product is that path with a UI: if student orgs and small teams cannot send crafted HTML from the account they already have, give them templates and OAuth instead of a new ESP.
G-notify is a mass mailer written in nuxt snd express without any third party libraries like (nodemailer). We directly contact GAPIs to send the mail.
What the repo actually ships
- googleapis talks to Gmail. mimetext builds the message. handlebars fills templates. That is the send path.
- mongoose plus a dbURI. Templates, sends, tracking events — not a spreadsheet.
- @google-cloud/storage and a service-account JSON for the unofficial CDN: people upload images, the mailer hosts them.
- exceljs / read-excel-file for recipient lists. The recruiting use case was a roster, not a marketing automation suite.
- Puppeteer is in the tree for render or preview work that a browser, not an email client, can do.
- ApexCharts on the client. README: tracking yes, stats not done. The chart library arrived before the aggregation did.
- OAuth env: GMAIL_CLIENT_ID, GMAIL_CLIENT_SECRET, GMAIL_REDIRECT_URL. You send as the user, through Google, not through a rented SMTP.
The Netlify post is the operations chapter. asyncData in Nuxt SSR does not survive generate. He rewrote those hooks to mounted so the static site could fetch. Putting the Express app on Netlify Functions hit a 69,905,067-byte CreateFunction cap — puppeteer will do that. The workaround was CORS to the existing Heroku SSR API, with the generated frontend on Netlify. Ugly. Documented. Shipped the night before an exam.
Request must be smaller than 69905067 bytes for the CreateFunction operation. … Then I needed up realising I already have an SSR version hosted on heroic, so I added soon CORS policies on that hosting and voila I had a version of my Application on Netlify contiously fetching data from a heroic server.