File size: 16,729 Bytes
2ec6949
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
#!/usr/bin/env node
/**
 * Batch generator: creates tailored HTML CVs + PDFs + TSV entries for 10 YC companies.
 * Usage: node scripts/batch-generate.mjs
 */

import { execFileSync } from 'child_process';
import { existsSync, writeFileSync, readFileSync, mkdirSync, appendFileSync } from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';

const __dirname = path.dirname(fileURLToPath(import.meta.url));
const ROOT = path.join(__dirname, '..');
const TEMPLATE = path.join(ROOT, 'templates', 'cv-template.html');
const OUTPUT = path.join(ROOT, 'output');
const TSV = path.join(ROOT, 'data', 'outreach.tsv');
const TODAY = new Date().toISOString().slice(0, 10);

if (!existsSync(OUTPUT)) mkdirSync(OUTPUT, { recursive: true });

const COMPANIES = [
  {
    name: 'Constant', role: 'Founding Engineer', recruiter: 'Ben Sender', email: 'ben@useconstant.com',
    summary: 'Cloud & Backend Engineer building high-scale serverless platforms with Java (Quarkus/Spring Boot), Angular, and AWS. Reduced cold-start latency by 60% and cloud OpEx by 65%.',
    pitch: 'I\'m a Cloud & Backend Engineer drawn to early-stage building at Constant. I led the migration of 17+ legacy apps to serverless AWS, cutting cold-start latency by 60% and cloud costs by 65% at BT Group. I designed a centralized auth system securing 45+ services and built Angular SPAs from scratch. As a Founding Engineer, I bring the full-stack versatility and infrastructure ownership your team needs.',
    angle: 'full-stack + founding engineer',
  },
  {
    name: 'Narrative', role: 'Founding Engineer (Backend + AI)', recruiter: 'Suchit Dubey', email: 'suchit@trynarrative.com',
    summary: 'Backend & AI Engineer with hands-on RAG system expertise (Mistral 20B + FAISS) and production serverless platforms on AWS.',
    pitch: 'I\'m a Backend & AI Engineer who built production RAG systems with Mistral 20B and FAISS vector search, implementing end-to-end pipelines from embedding to generation. At BT Group, I built serverless platforms handling 5,000+ RPM and reduced cold-start latency by 60%. Narrative\'s AI-powered testing platform aligns perfectly with my experience combining backend infrastructure with LLM deployment.',
    angle: 'backend + AI infrastructure',
  },
  {
    name: 'Reviving Mind', role: 'Founding Engineer', recruiter: 'Rahul Sharma', email: 'rahul@revivingmind.com',
    summary: 'Cloud & Backend Engineer specializing in secure, scalable serverless platforms and AI-powered systems.',
    pitch: 'I\'m a Cloud & Backend Engineer passionate about using technology for meaningful impact β€” Reviving Mind\'s mission to combat senior isolation through AI-driven collaborative care resonates deeply. I built high-reliability serverless platforms achieving 99.95% availability and LLM-powered recommendation systems. My experience designing secure, compliant infrastructure for enterprise deployments maps well to healthcare\'s requirements.',
    angle: 'healthtech + infrastructure + AI',
  },
  {
    name: 'Wolfia', role: 'Software Engineer (Full-Stack, AI-Native)', recruiter: 'Naren Manoharan', email: 'naren@wolfia.com',
    summary: 'Full-Stack Engineer with AI-native development experience: LLM-powered RAG systems + Angular SPA + serverless AWS.',
    pitch: 'I\'m a Full-Stack Engineer who builds AI-native applications end-to-end. I deployed Mistral 20B locally on GPU with FAISS vector search for a production RAG recommendation engine and led a JSP-to-Angular SPA migration at BT Group. Wolfia\'s AI agents for security questionnaires is solving a real pain point β€” I\'d love to help scale it.',
    angle: 'full-stack + AI-native + low experience barrier (1+ yr)',
  },
  {
    name: 'Whip', role: 'Founding Mobile Engineer (React Native)', recruiter: 'Agam Jain', email: 'agam@whip.run',
    summary: 'Full-Stack Engineer experienced in Angular/TypeScript frontend, AWS serverless backend, and building consumer-scale applications.',
    pitch: 'I\'m a Full-Stack Engineer who led a JSP-to-Angular SPA migration and built serverless platforms handling 45+ services at BT Group. While my frontend work is Angular rather than React Native, I bring deep component architecture, state management, and API integration experience. Whip\'s interactive AI mini-app platform is a fascinating consumer product β€” I\'m excited about the Bengaluru-based founding team opportunity.',
    angle: 'full-stack + Bengaluru + consumer product',
  },
  {
    name: 'Allus AI', role: 'Founding AI Agent Engineer', recruiter: 'Shijie Wang', email: 'shijie.wang@allus.ai',
    summary: 'AI Engineer with production RAG/LLM deployment experience and distributed systems expertise on AWS.',
    pitch: 'I\'m an Engineer who combines AI deployment experience with production infrastructure. I built an end-to-end RAG pipeline with Mistral 20B + FAISS for real-time AI recommendations and deployed distributed systems on AWS with 99.95% availability. Allus AI\'s vision foundation model for manufacturing defect detection is tackling a hard, high-impact problem β€” I\'d contribute both AI and infrastructure depth.',
    angle: 'AI + infrastructure + manufacturing AI',
  },
  {
    name: 'Sully.ai', role: 'Technical Lead', recruiter: 'Ahmed Omar', email: 'omar@sully.ai',
    summary: 'Cloud & Backend Engineer with platform security design expertise, team leadership, and enterprise-scale infrastructure.',
    pitch: 'I\'m a Cloud & Backend Engineer experienced in leading platform-wide initiatives β€” I designed a centralized auth system serving 45+ services, led the migration of 17+ apps to serverless, and mentored team members on CI/CD and security practices. Sully.ai\'s AI agents for hospital operations operate at the intersection of reliability and scale that I thrive in.',
    angle: 'technical leadership + platform engineering + healthcare AI',
  },
  {
    name: 'SuperKalam', role: 'Mobile Engineer (React Native + Fullstack)', recruiter: 'Aseem Gupta', email: 'aseem@superkalam.com',
    summary: 'Full-Stack Engineer with Angular frontend expertise and scalable backend platforms on AWS.',
    pitch: 'I\'m a Full-Stack Engineer who led a JSP-to-Angular SPA migration and built serverless platforms on AWS at BT Group. While my frontend expertise is Angular, I bring strong component architecture, state management, and API design skills that translate directly to React Native. SuperKalam\'s AI-powered UPSC mentoring platform has meaningful scale potential in India\'s edtech space.',
    angle: 'full-stack + edtech + India market',
  },
  {
    name: 'Convexia', role: 'Founding Engineer', recruiter: 'Rahul Vijayan', email: 'rahul@convexia.bio',
    summary: 'Cloud & Backend Engineer with distributed systems expertise, AI pipeline experience, and full-stack versatility.',
    pitch: 'I\'m a Full-Stack Engineer excited by Convexia\'s AI-maximalist approach to pharma β€” replacing manual drug diligence with AI agents. I built production-grade AI pipelines (LLM + vector search) and scaled serverless platforms to 5,000+ RPM at 99.95% availability. I\'ve taken end-to-end ownership of complex migrations and love building from scratch.',
    angle: 'AI agents + pharma + full-stack',
  },
  {
    name: 'Hera', role: 'Founding AI Engineer', recruiter: 'Chia-Lun Wu', email: 'chia@hera.video',
    summary: 'Full-Stack & AI Engineer who built Angular SPAs, serverless backends, and LLM-powered recommendation systems.',
    pitch: 'I\'m a Full-Stack Engineer who built Angular-based SPAs and serverless platforms on AWS serving 45+ microservices. My AI work includes deploying Mistral 20B with FAISS for real-time recommendations. Hera\'s AI motion designer is transforming a creative workflow I find fascinating β€” automating the tedious while preserving creative control is exactly the kind of product challenge I want to solve.',
    angle: 'full-stack + AI + creative tools',
  },
];

function escapeTsv(val) {
  if (val === null || val === undefined) return '';
  const s = String(val);
  if (s.includes('\t') || s.includes('\n') || s.includes('"')) {
    return '"' + s.replace(/"/g, '""') + '"';
  }
  return s;
}

function buildSummaryHtml(c, companySummary) {
  const location = ['Constant','Wolfia','Reviving Mind','Allus AI','Sully.ai','Convexia','Hera'].includes(c.name) ? 'Bengaluru, India (Remote)' :
    'Bengaluru, India';
  const linkedin = 'https://linkedin.com/in/rohan-p-h-876865250';
  const portfolio = 'https://rohanph-cloud-engineer-75sm7wl.gamma.site';

  return [
    `<div class="section avoid-break">`,
    `  <div class="section-title">Professional Summary</div>`,
    `  <div class="summary-text">${companySummary}</div>`,
    `</div>`
  ].join('\n');
}

function buildCompetencies() {
  return [
    'Cloud & Backend Engineering', 'Java (Quarkus / Spring Boot)',
    'AWS Serverless (Lambda, API Gateway)', 'Angular / Frontend',
    'Platform Security (JWT, RSA, OAuth2/OIDC)', 'LLM / RAG Systems',
    'Distributed Systems', 'CI/CD & DevOps',
  ].map(s => `<span class="competency-tag">${s}</span>`).join('\n');
}

function buildExperience() {
  return `
<div class="job">
  <div class="job-header">
    <span class="job-company">BT Group (Openreach)</span>
    <span class="job-period">Aug 2024 – Present</span>
  </div>
  <div class="job-role">Cloud Engineering Professional | Bengaluru</div>
  <ul>
    <li>Migrated 17/45+ legacy applications to a serverless AWS platform (API Gateway + Lambda + Quarkus), supporting REST, SOAP, SES workflows, and DB integrations.</li>
    <li>Designed a centralized Lambda Authorizer handling dual authentication: Custom JWT + Azure AD JWT (OIDC) with RSA-encrypted headers, audience validation, group-based authorization, and fail-secure policy enforcement.</li>
    <li>Reduced auth latency to 80-120ms (warm) while eliminating duplication across 45+ services.</li>
    <li>Re-architected systems from Spring Boot to Quarkus, reducing cold-start latency by 60% and enabling efficient Lambda execution.</li>
    <li>Optimized AWS resource utilization, achieving a 65% reduction in cloud OpEx.</li>
    <li>Led migration from JSP to Angular SPA + headless AEM, improving UX, scalability, and frontend-backend decoupling.</li>
    <li>Designed CI/CD pipelines (GitLab + SAM) with automated builds, deployment, security scans, and environment configuration.</li>
    <li>Implemented structured logging, observability, and debugging pipelines using CloudWatch.</li>
    <li>Awarded Best Platform Security Innovation and Best Migration Project (2025).</li>
  </ul>
</div>
<div class="job">
  <div class="job-header">
    <span class="job-company">BT Group (Openreach)</span>
    <span class="job-period">Jan 2024 – Jul 2024</span>
  </div>
  <div class="job-role">Software Development Intern | Bengaluru</div>
  <ul>
    <li>Migrated Spring Boot services to Quarkus, improving startup times by 40%.</li>
    <li>Implemented circuit breakers and retry logic to meet a strict 2s SLA across distributed APIs.</li>
    <li>Built high-throughput SOAP integrations handling 5,000+ RPM.</li>
  </ul>
</div>
<div class="job">
  <div class="job-header">
    <span class="job-company">HPCC Systems (LexisNexis)</span>
    <span class="job-period">Sep 2022 – Aug 2023</span>
  </div>
  <div class="job-role">Project Intern | Remote</div>
  <ul>
    <li>Won 1st place among 45 teams in a hackathon internship conversion.</li>
    <li>Built a distributed tensor processing pipeline embedding Python (NumPy) in ECL for large-scale image data.</li>
    <li>Developed multi-node tensor resizing and stacking libraries for distributed environments.</li>
  </ul>
</div>`;
}

function buildProject() {
  return `
<div class="project">
  <div class="project-title">AI Wardrobe Intelligence β€” RAG Outfit Planner</div>
  <div class="project-desc">
    Built an LLM-powered recommendation engine using Mistral 20B deployed locally on GPU. Designed end-to-end RAG pipeline: embedding β†’ FAISS retrieval β†’ gap analysis β†’ prompt planning β†’ LLM generation. Implemented semantic wardrobe search for context-aware outfit generation. Built authentication with dependency injection for protected APIs.
  </div>
  <div class="project-tech">FastAPI, SQLite, FAISS, Mistral 20B, Python, Docker</div>
</div>`;
}

function buildEducation() {
  return `
<div class="edu-item">
  <div class="edu-header">
    <span class="edu-title">B.E. Computer Science and Engineering</span>
    <span class="edu-year">2020 – 2024</span>
  </div>
  <div class="edu-org">R.V. College of Engineering, Bengaluru</div>
</div>`;
}

function buildSkills() {
  const categories = [
    ['Languages', 'Java, Python, JavaScript, C/C++'],
    ['Backend', 'Quarkus, Spring Boot, REST, SOAP, Microservices'],
    ['Cloud', 'AWS Lambda, API Gateway, CloudFront, EC2, ECR, SES, CloudWatch, SAM'],
    ['Security', 'JWT, OAuth2/OIDC, Azure AD, RSA Encryption, API Authorizers'],
    ['Data', 'SQL, DynamoDB, Kafka, SQS, Elasticsearch, FAISS'],
    ['Frontend', 'Angular, TypeScript, HTML/CSS, JavaScript'],
    ['Tools', 'Git, Docker, Linux, Playwright, JUnit, Mockito, CI/CD'],
  ];
  return categories.map(([cat, val]) =>
    `<div class="skill-item"><span class="skill-category">${cat}:</span> ${val}</div>`
  ).join('\n');
}

function generateHtml(c, summary) {
  const template = readFileSync(TEMPLATE, 'utf-8');
  const summaryHtml = buildSummaryHtml(c, summary);
  const competenciesHtml = buildCompetencies();
  const experienceHtml = buildExperience();
  const projectHtml = buildProject();
  const educationHtml = buildEducation();
  const skillsHtml = buildSkills();

  return template
    .replace(/{{NAME}}/g, 'Rohan P H')
    .replace(/{{EMAIL}}/g, 'rohanph327@gmail.com')
    .replace(/{{LINKEDIN_URL}}/g, 'https://linkedin.com/in/rohan-p-h-876865250')
    .replace(/{{LINKEDIN_DISPLAY}}/g, 'linkedin.com/in/rohan-p-h-876865250')
    .replace(/{{PORTFOLIO_URL}}/g, 'https://rohanph-cloud-engineer-75sm7wl.gamma.site')
    .replace(/{{PORTFOLIO_DISPLAY}}/g, 'rohanph-cloud-engineer-75sm7wl.gamma.site')
    .replace(/{{LOCATION}}/g, 'Bengaluru, India')
    .replace(/{{LANG}}/g, 'en')
    .replace(/{{PAGE_WIDTH}}/g, '800px')
    .replace(/{{SECTION_SUMMARY}}/g, 'Professional Summary')
    .replace(/{{SECTION_COMPETENCIES}}/g, 'Core Competencies')
    .replace(/{{SECTION_EXPERIENCE}}/g, 'Experience')
    .replace(/{{SECTION_PROJECTS}}/g, 'Projects')
    .replace(/{{SECTION_EDUCATION}}/g, 'Education')
    .replace(/{{SECTION_CERTIFICATIONS}}/g, '')
    .replace(/{{SECTION_SKILLS}}/g, 'Technical Skills')
    .replace(/{{SUMMARY_TEXT}}/g, summary)
    .replace(/{{COMPETENCIES}}/g, competenciesHtml)
    .replace(/{{EXPERIENCE}}/g, experienceHtml)
    .replace(/{{PROJECTS}}/g, projectHtml)
    .replace(/{{EDUCATION}}/g, educationHtml)
    .replace(/{{CERTIFICATIONS}}/g, '')
    .replace(/{{SKILLS}}/g, skillsHtml);
}

async function main() {
  console.log('πŸš€ Generating batch of 10 tailored CVs + outreach entries...\n');

  for (const c of COMPANIES) {
    const safeName = c.name.toLowerCase().replace(/[^a-z0-9]/g, '');
    const htmlPath = path.join(OUTPUT, `cv-${safeName}.html`);
    const pdfPath = path.join(OUTPUT, `cv-rohan-ph-${safeName}-${TODAY}.pdf`);
    const shortPdf = path.basename(pdfPath);

    // Generate HTML
    const html = generateHtml(c, c.summary);
    writeFileSync(htmlPath, html, 'utf-8');
    console.log(`  βœ“ HTML: ${c.name} (${c.role})`);

    // Generate PDF
    try {
      execFileSync('node', [
        'generate-pdf.mjs', htmlPath, pdfPath, '--format=a4',
      ], { cwd: ROOT, timeout: 30000, stdio: 'pipe' });
      console.log(`  βœ“ PDF: ${shortPdf}`);
    } catch (e) {
      console.log(`  βœ— PDF failed for ${c.name}: ${e.message}`);
    }

    // Build email body
    const linkedin = 'linkedin.com/in/rohan-p-h-876865250';
    const portfolio = 'rohanph-cloud-engineer-75sm7wl.gamma.site';
    const emailBody = `Hi ${c.recruiter.split(' ')[0]},

${c.pitch}

I've attached my CV for more detail. My LinkedIn is ${linkedin} and portfolio: ${portfolio}

Would you be open to a brief conversation?

Best,
Rohan P H`;

    const subject = `${c.role === 'Founding Engineer' ? 'Founding Engineer' : c.role} β€” exploring ${c.name}`;

    // Append to TSV
    const tsvLine = [
      TODAY, c.name, c.role, c.recruiter, c.email,
      'coldemail', 'draft', emailBody.replace(/\n/g, '\\n'), subject, shortPdf,
    ];
    appendFileSync(TSV, '\n' + tsvLine.map(escapeTsv).join('\t'), 'utf-8');
    console.log(`  βœ“ TSV entry added`);
    console.log('');
  }

  console.log(`\nβœ… All 10 entries generated. TSV updated at ${TSV}`);
  console.log(`   Next: node send-outreach.mjs to dispatch emails`);
}

main();