DEV Community

Cover image for The Night I Stopped Applying to Jobs — And Built My Own Outreach Engine
Dnyaneshwar Vitthal Shekade
Dnyaneshwar Vitthal Shekade

Posted on • Originally published at dnyan.vercel.app

The Night I Stopped Applying to Jobs — And Built My Own Outreach Engine

The Night I Stopped Applying to Jobs — And Built My Own Outreach Engine

The Night I Stopped Applying to Jobs

It was 1:47 AM.

I had 12 tabs open.

LinkedIn.

Naukri.

Company career pages.

My resume in one window.

A half-written email in another.

Copy.

Paste.

Edit.

Change company name.

Change role.

Rewrite first paragraph.

Attach resume.

Send.

Repeat.

By the time I finished the fifth application, I felt drained. Not because I didn’t want the job.

But because the process felt… inefficient. That night, I closed all the tabs and asked myself one question:

Why am I manually doing something that can be systemized?


The Real Frustration

Applying wasn’t hard.

But applying well — at scale — was.

If you personalize properly:

  • It takes 15–20 minutes per application.

  • Multiply that by 20 roles a week.

  • That’s hours of repetitive work.

And worst of all?

You don’t even know who opened your email.

You don’t track who you contacted.

You don’t optimize your message.

It’s chaos disguised as effort.


A Different Way of Thinking

Startups don’t grow by manually messaging one user at a time.

They build systems.They automate intelligently. They personalize at scale. They track outcomes.

So I thought:

What if I treated my job search like a feature of my portfolio?

What if instead of applying…

I built an Outreach Engine?


The First Version Was Ugly

I started simple.

Paste job description → generate email.

It worked.

Then I improved it. Extract responsibilities. Map them to my skills. Generate structured HTML.

Add proper signature. Allow editing.

Then came the real upgrade: Import 200 HR emails at once. Send individually. Track status per recipient.

That’s when it stopped being a script.

It became a system.


Introducing: Find a Job Studio

I integrated everything into my portfolio dashboard.

Now the flow looks like this:

  1. Paste job description.

  2. AI extracts key responsibilities.

  3. Generate structured professional email.

  4. Import HR contacts (CSV or manual).

  5. Attach resume.

  6. Send with delivery tracking.

Under the hood:

  • Dual AI providers (OpenRouter + Eden AI)

  • Multi mail providers (Resend, SMTP, PHP API)

  • Per-recipient status logging

  • Validation and rate limiting

  • HTML sanitization

  • Role-based access control

But from the outside?

It feels simple.


Something Unexpecteed happend

When I built this…

I realized it wasn’t just about job hunting.

It was about control.

Instead of feeling like I was chasing opportunities…

I felt like I was running campaigns.

Instead of reacting…

I was executing.

Instead of random effort…

I had structured momentum.


Why This Matters

The traditional job search model is passive.

Apply.

Wait.

Hope.

I wanted something proactive.

Strategic.

Repeatable.

So I engineered it.


What It Taught Me

This project taught me more than sending applications ever could:

  • AI orchestration

  • Secure backend design

  • Multi-provider failover

  • Email infrastructure

  • Input validation at scale

  • Workflow-driven UX

It turned a frustrating experience into a real-world product experiment.


The Bigger Lesson

Sometimes the solution to frustration isn’t working harder.

It’s building smarter.

That night at 1:47 AM…

I stopped applying to jobs.

And started building the system that would apply with me.

And honestly?

That changed everything.

Tech Stack

Find a Job Studio

├── Frontend Layer

│ ├── Next.js 14 (App Router)

│ ├── React

│ ├── TypeScript

│ ├── Tailwind CSS

│ └── Role-Based Dashboard Architecture

├── Workflow Engine

│ ├── Job Input Module

│ ├── Recipient Import Module

│ ├── AI Draft Generator

│ ├── Resume Attachment Handler

│ └── Dispatch Controller

├── AI Layer

│ ├── Provider Abstraction

│ │ ├── OpenRouter (Primary)

│ │ └── Eden AI (Fallback)

│ │

│ ├── Structured Output Enforcement

│ │ ├── subject

│ │ ├── html

│ │ └── extractedResponsibilities

│ │

│ ├── Job Description Parsing

│ ├── Responsibility Extraction

│ ├── Skills Mapping

│ ├── HTML Email Generation

│ └── Signature Injection

├── Email Delivery Layer

│ ├── Provider Abstraction

│ │ ├── Resend (API)

│ │ ├── SMTP (Nodemailer)

│ │ └── PHP Mail API

│ │

│ ├── Per-Recipient Dispatch

│ ├── Concurrency Control

│ └── Delivery Status Tracking

├── File & Data Handling

│ ├── CSV Parsing

│ │ ├── Client Validation

│ │ └── Server Validation

│ │

│ ├── Email Format Validation

│ ├── PDF Attachment Validation

│ │ ├── MIME Check

│ │ ├── File Signature Check

│ │ └── Size Limit

│ │

│ └── HTML Sanitization Pipeline

├── Persistence Layer

│ ├── Generated Templates Storage

│ ├── Extracted Responsibilities Storage

│ ├── HR Contact Memory

│ ├── Send Logs

│ │ ├── Provider Used

│ │ ├── Message ID

│ │ ├── Success / Failure

│ │ └── Error Logs

│ │

│ └── Status History

├── Security & Control

│ ├── Role-Based Access (RBAC)

│ ├── Rate Limiting (AI + Mail)

│ ├── Max Recipient Throttling

│ ├── Server-Side API Key Handling

│ └── Defensive Input Validation

└── Infrastructure Layer

├── Vercel Deployment

├── Environment-Driven Configuration

│ ├── AI Provider Config

│ ├── Mail Provider Config

│ └── Token Limits

├── Provider Fallback Logic

└── Scalable Serverless API Routes

Top comments (0)