Inspiration

As a computer science student at VIT Vellore, I've watched countless talented peers struggle with the internship hunt—not because they lack skills, but because they don't know how to communicate them effectively. Modern internship hunting isn't just about applying anymore; it's about personalized outreach, follow-ups, and showing genuine interest in companies. But crafting these messages is exhausting: copy-pasting job descriptions, rewriting cover letters, and constantly wondering, "Does this sound professional enough?"

I found myself using ChatGPT to draft these messages, but the workflow was tedious—upload resume, paste job description, write a prompt, repeat 50 times. As a Gen-Z developer who believes in automating repetitive tasks, I thought: Why not build a tool that does this in one click?

What it does

EasyReach is a Chrome extension that generates personalized internship outreach messages using AI. Here's how it works:

  1. One-time setup: Upload your CV once. The extension parses it using AI and stores your profile locally.
  2. Visit any job page: Open any internship posting on LinkedIn, Internshala, or company career sites.
  3. Click "Generate": EasyReach scrapes the job description and combines it with your CV to create a tailored message.
  4. Choose your style:
    • Tone: Casual, Professional, or Enthusiastic
    • Length: Short, Medium, or Long
    • Custom instructions: Add specific requests like "Mention my CGPA" and save them for future use

EasyReach generates three types of messages:

  • Cold emails (with subject lines and extracted email addresses)
  • LinkedIn connection requests (under 300 characters)
  • Follow-up messages (polite nudges after initial outreach)

All data is stored locally in your browser—no server storage, no tracking, completely private.

How we built it

Tech Stack:

  • Frontend: Vanilla JavaScript (Manifest V3), Chrome APIs for storage and scripting
  • Backend: Node.js + Express deployed on Google Cloud Run
  • AI: Google Gemini 2.5 Flash API for CV parsing and message generation
  • Security: CORS restrictions, rate limiting, secret token validation, input sanitization

Architecture:

Student's Browser (Extension)
    ↓ (scrapes job page)
Cloud Run Backend (Node.js)
    ↓ (structured prompt)
Gemini 2.5 Flash API
    ↓ (generates message)
Student receives personalized output

Key design decisions:

  1. Local-first data storage: Used chrome.storage.local to keep CV data on the user's device, ensuring privacy and eliminating server costs.
  2. Generic scraping: Instead of hardcoding specific sites, the extension works on ANY webpage, making it future-proof.
  3. Smart CV parsing: Built a structured JSON schema for CV data extraction, including education scores, achievements, certifications, publications, and patents.
  4. Cost optimization: Implemented rate limiting (30 requests per 15 minutes), max instance caps (10 containers), and input validation to prevent abuse while keeping the service free.

Challenges we ran into

1. PDF Parsing Reliability

Initially, pdf-parse struggled with complex resume formats. Some CVs had tables, multiple columns, or embedded images that broke the text extraction. I solved this by:

  • Limiting input to 4000 characters (enough for most resumes)
  • Using Gemini's intelligent parsing to handle messy text
  • Supporting both PDF and plain text uploads

2. AI Output Consistency

Gemini sometimes included placeholders like [Your Name] or [CGPA] instead of using actual data. I fixed this by:

  • Explicitly instructing the AI: "Use the student's actual name. DO NOT use placeholders."
  • Adding validation to ensure the AI-extracted name wasn't the filename
  • Iterating on prompts to make outputs sound human, not corporate

3. Security Without Server-Side Storage

I wanted zero data collection, but still needed to prevent abuse. The solution:

  • CORS: Backend only accepts requests from my specific extension origin
  • Rate limiting: Per-IP caps to prevent spam
  • Token validation: Shared secret between extension and backend
  • Instance caps: Max 10 concurrent Cloud Run containers to limit costs

4. Balancing Tone and Professionalism

Early outputs sounded robotic—full of buzzwords like "leveraged," "robust understanding," and "honed skills." After testing with friends, I rewrote prompts to:

  • Avoid corporate jargon
  • Use first-person ("I built..." not "The student built...")
  • Sound like a real student, not a resume generator

5. Chrome Web Store Requirements

Navigating Chrome's strict policies was tricky:

  • Removed <all_urls> host permissions in favor of activeTab for faster approval
  • Wrote detailed justifications for each permission
  • Created a privacy policy that clearly explained data handling

Accomplishments that we're proud of

  1. Built a production-ready tool in under a week that actually solves a real problem students face daily

  2. Zero data collection: Designed a privacy-first architecture where user data never touches my servers

  3. Cost-efficient at scale: With rate limiting and instance caps, even 500 users would cost less than ₹500/month

  4. Genuinely useful AI: The messages don't sound AI-generated—they're personalized, natural, and actually get responses

  5. Customization without complexity: Users can save custom instructions like "Always mention my CGPA" and never think about it again

  6. Open-source ready: Designed the codebase so other students can fork it, deploy their own backend, and customize it for their needs

What we learned

1. AI prompt engineering is an art

Getting Gemini to output natural, human-sounding text required dozens of iterations. I learned that being specific (e.g., "Write in first person, avoid buzzwords like 'leveraged'") works better than being generic (e.g., "Write naturally").

2. Privacy-first design is possible (and cheap)

By storing data locally and only processing it on-demand, I eliminated the need for databases, authentication, and complex backend infrastructure. This made the entire system simpler, faster, and more private.

3. Real users reveal real problems

When I shared an early version with friends, they immediately pointed out issues I hadn't noticed:

  • "Why does it say 'Resume.pdf' instead of my name?"
  • "Can I make it sound less formal?"
  • "I want to always mention my CGPA without typing it every time"

These insights shaped V2's custom instructions and tone/length controls.

4. Security layers > security through obscurity

I initially worried about exposing the backend URL and secret token in client-side code. But CORS, rate limiting, and origin validation made the system secure regardless. Defense in depth beats hiding secrets.

5. Deployment is a product feature

Making deployment easy (Cloud Run + gcloud CLI) meant others could self-host. This turned EasyReach from "my extension" into "a template anyone can use."

What's next for EasyReach

Short-term (next 2 months):

  • Message history: Store past generated messages locally so users can reference them
  • A/B testing: Let users generate 2-3 versions of a message and pick the best one
  • Multi-language support: Expand beyond English for international students
  • Email integration: One-click send directly from the extension (via Gmail API)

Medium-term (6 months):

  • Company research integration: Automatically pull recent company news and suggest mentioning it in messages
  • Analytics dashboard: Show users response rates and what message styles work best
  • LinkedIn auto-connect: Integrate with LinkedIn API to send connection requests directly
  • University partnerships: Work with career services offices to offer EasyReach to all students

Long-term vision:

Transform EasyReach from a messaging tool into a full internship assistant:

  • Track application status across platforms
  • Suggest when to follow up based on typical response times
  • Generate interview preparation materials based on job descriptions
  • Connect students with alumni at target companies

Monetization (if needed):

  • Keep the core free forever
  • Premium tier (₹99/month): Unlimited messages, priority support, advanced analytics
  • Enterprise tier for universities: Bulk deployment with usage analytics for career services

The goal: Make internship hunting less about "who can write the best email" and more about "who has the right skills." Every student deserves a fair shot at their dream internship—EasyReach is my attempt at leveling the playing field.

Share this project:

Updates