<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Syed Mohammad Abbas Rizvi</title>
    <description>The latest articles on DEV Community by Syed Mohammad Abbas Rizvi (@abbas7120).</description>
    <link>https://dev.to/abbas7120</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2532251%2Fcbf9b7da-3dda-45bd-b925-b880aaef5e30.png</url>
      <title>DEV Community: Syed Mohammad Abbas Rizvi</title>
      <link>https://dev.to/abbas7120</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abbas7120"/>
    <language>en</language>
    <item>
      <title>I Built a Cold Email Generator That Never Needs a Prompt</title>
      <dc:creator>Syed Mohammad Abbas Rizvi</dc:creator>
      <pubDate>Wed, 14 Oct 2026 21:01:22 +0000</pubDate>
      <link>https://dev.to/abbas7120/i-built-a-cold-email-generator-that-never-needs-a-prompt-90</link>
      <guid>https://dev.to/abbas7120/i-built-a-cold-email-generator-that-never-needs-a-prompt-90</guid>
      <description>&lt;p&gt;This is a submission for the &lt;em&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Built ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ColdMailr AI&lt;/strong&gt; is a zero-prompt cold email generator for job seekers. You fill in three fields &lt;em&gt;(target company, role, and your one core achievement)&lt;/em&gt;, click a button, and get a &lt;strong&gt;ready-to-send cold email&lt;/strong&gt; for a hiring manager.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who would pay for it ?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Students, freshers, and career switchers&lt;/strong&gt; who know cold outreach works but freeze at the blank page. &lt;em&gt;Career coaches, bootcamps, and college placement cells&lt;/em&gt; could also use it with their cohorts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; getting a good email out of a general chatbot means writing a prompt first &lt;em&gt;(“Act as a career coach, keep it under 100 words, don’t invent facts...”)&lt;/em&gt;, and the result changes every time. Many people either don’t know how to prompt well or give up after one mediocre draft.&lt;/p&gt;

&lt;p&gt;How it’s different from ChatGPT , Claude or other LLM chat tools:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In Chat LLM&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You write “act as a recruiter / career coach...” every time.&lt;/li&gt;
&lt;li&gt;Output format changes on every run.
&lt;/li&gt;
&lt;li&gt;May invent numbers, company news or achievements&lt;/li&gt;
&lt;li&gt;One answer, take it or leave it
&lt;/li&gt;
&lt;li&gt;You judge whether it’s good&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;BUT&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In ColdMailr AI&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The role, rules and tone are built in. You only enter your facts&lt;/li&gt;
&lt;li&gt;Same structure every time: subject line, greeting, 3 short paragraphs, one low-pressure ask&lt;/li&gt;
&lt;li&gt;A validator checks every draft and rejects invented numbers and fake company claims&lt;/li&gt;
&lt;li&gt;The model writes 3 candidates, and the app picks the cleanest one&lt;/li&gt;
&lt;li&gt;Banned clichés (“passionate”, “I hope this finds you well”) and length limits are enforced in code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;To be fair, a skilled prompter can get a similar email from any chat model. ColdMailr’s value is packaging that expertise so nobody has to prompt at all, and checking the output before the user sees it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Demo&lt;/p&gt;

&lt;p&gt;🔗 Live: &lt;a href="https://coldmailr.onrender.com/" rel="noopener noreferrer"&gt;https://coldmailr.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(It runs on a free Render instance, so the first load after idle time can take up to a minute while the server wakes up.)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fknbg2xksnzhcsjjujfhz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fknbg2xksnzhcsjjujfhz.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code&lt;/p&gt;

&lt;p&gt;{&lt;a href="https://github.com/Abbas7120/ColdMailR" rel="noopener noreferrer"&gt;https://github.com/Abbas7120/ColdMailR&lt;/a&gt;}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How I Built It ?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;strong&gt;Qwen3-8B&lt;/strong&gt;, an open-weight model, served through &lt;strong&gt;Tinker&lt;/strong&gt; &lt;strong&gt;(Thinking Machines)&lt;/strong&gt; for sampling.&lt;br&gt;
&lt;strong&gt;Backend: Node.js + Express serves the UI and API&lt;/strong&gt;. It passes each request to a Python script that talks to Tinker.&lt;br&gt;
&lt;strong&gt;Prompt design:&lt;/strong&gt; a strict system prompt (the sender is always the candidate, use only the given facts, copy numbers exactly) plus four few-shot examples from different fields (engineering, marketing, a fresher with no numbers, sales), so it works for any role.&lt;br&gt;
&lt;strong&gt;Quality layer:&lt;/strong&gt; the model generates 3 candidate emails per request. A Python validator checks each for format, length, company mention, banned phrases and any number that wasn’t in the user’s input. The best passing candidate is returned.&lt;br&gt;
&lt;strong&gt;Honest failures:&lt;/strong&gt; if generation fails, the user sees a clear error. The app never shows a fake template as if it were AI output.&lt;br&gt;
&lt;strong&gt;UX: a staged progress bar&lt;/strong&gt; (“Matching tone to the role...”, “Checking quality and facts...”) so the &lt;strong&gt;wait feels purposeful&lt;/strong&gt;.&lt;br&gt;
&lt;strong&gt;Deployment:&lt;/strong&gt; &lt;strong&gt;Render&lt;/strong&gt; (Node web service with a Python virtual environment).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Does Open Innovation Matter?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost and control:&lt;/strong&gt; with an open-weight model, I can choose the model, swap it, or later fine-tune it on good cold emails. I’m not locked to one vendor’s pricing, rate limits or policy changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fine-tuning:&lt;/strong&gt; a closed chat API gives me a prompt box. An open model on Tinker gives me a path to train a model that writes cold emails specifically, which is the real moat for a product like this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trust:&lt;/strong&gt; the whole pipeline, including the prompt and the validator, is open on GitHub, so users and contributors can inspect exactly how emails are produced and add rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accessibility:&lt;/strong&gt; students can fork it, run it, and improve it without needing a paid closed API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prize Categories&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Render:&lt;/strong&gt; &lt;br&gt;
Render is the &lt;strong&gt;production runtime&lt;/strong&gt; for the whole app. One Render web service runs the Node/Express server, the UI, and the Python AI pipeline: prompt building, tokenization, Tinker sampling and output validation. The live demo at &lt;a href="https://coldmailr.onrender.com/" rel="noopener noreferrer"&gt;https://coldmailr.onrender.com/&lt;/a&gt; is that service.&lt;br&gt;
No Docker, a &lt;strong&gt;plain Render&lt;/strong&gt; build. The Node runtime’s build command creates a Python virtual environment, installs the Python dependencies, and pre-downloads the Qwen tokenizer, so users don’t wait on a download. The start command is just node server.js.&lt;br&gt;
&lt;strong&gt;Secrets&lt;/strong&gt; stay out of the repo. The Tinker API key lives in Render’s environment variables, and .env and .venv are git-ignored.&lt;br&gt;
Deploy on push. Every push to main redeploys, so contributors’ pull requests ship quickly.&lt;br&gt;
&lt;strong&gt;Mixed-language stack on one service&lt;/strong&gt; , Render runs Node and Python side by side without separate infrastructure, which keeps hosting simple for a solo builder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best Use of Tinker:&lt;/strong&gt; &lt;br&gt;
Tinker is the only model backend. Every email comes from Qwen3-8B (open-weight), sampled through Tinker’s ServiceClient and SamplingClient. There is no closed API anywhere in the pipeline.&lt;br&gt;
&lt;strong&gt;Best-of-N&lt;/strong&gt; sampling in one call. Each request asks Tinker for 3 candidate emails with num_samples=3. A validator then scores them for format, length, company mention, cliché phrases and invented numbers, and returns the cleanest one. Tinker’s batched sampling makes this cheap enough to run on every click.&lt;br&gt;
&lt;strong&gt;Prompt control at the token level&lt;/strong&gt;. I build the Qwen chat template myself (system rules plus four few-shot examples), tokenize it locally, and pass token IDs to Tinker. This gives exact control over stop tokens and the empty-think block, which a hosted chat endpoint wouldn’t expose.&lt;br&gt;
&lt;strong&gt;Reliability&lt;/strong&gt;, not just generation. Tinker supplies the candidates and my validation layer decides what the user sees. The result is that the app never shows invented numbers or fake company claims.&lt;br&gt;
Built to grow into fine-tuning. The validator’s accepted outputs are exactly the training data needed to fine-tune the model on Tinker for cold emails specifically. That is the next step on the roadmap.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
