Spaces:
Sleeping
Sleeping
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();
|