Auto-deploy: 2026-05-17 22:45:01

This commit is contained in:
Hamza-Ayed
2026-05-17 22:45:01 +03:00
parent 8dc55c698e
commit 5fd6969ff8
5 changed files with 177 additions and 19 deletions

View File

@@ -955,6 +955,149 @@ Brief honest assessment of this opportunity for my profile`
setTimeout(() => toast.classList.remove('show'), 2500);
}
// ─── List Scanner ────────────────────────────────────────────────────────
function injectListScanner() {
if (document.getElementById('lja-scan-btn')) return;
const btn = document.createElement('button');
btn.id = 'lja-scan-btn';
btn.innerHTML = '🔍 Scan List';
btn.style.cssText = `
position: fixed;
bottom: 20px;
left: 20px;
z-index: 999999;
background: linear-gradient(135deg, #00d67e, #00a65e);
color: white;
border: none;
border-radius: 50px;
padding: 12px 24px;
font-size: 14px;
font-weight: bold;
cursor: pointer;
box-shadow: 0 4px 15px rgba(0, 214, 126, 0.4);
transition: transform 0.2s;
font-family: Arial, sans-serif;
`;
btn.onmouseover = () => btn.style.transform = 'scale(1.05)';
btn.onmouseout = () => btn.style.transform = 'scale(1)';
btn.onclick = async () => {
btn.innerHTML = '⏳ Scanning...';
try {
await scanJobList();
} catch (e) {
console.error(e);
alert('Scan failed: ' + e.message);
}
btn.innerHTML = '🔍 Scan List';
};
document.body.appendChild(btn);
}
async function scanJobList() {
const listItems = document.querySelectorAll('.jobs-search-results__list-item, .job-card-container');
if (!listItems.length) {
alert('No job items found on this page. Scroll down to load them.');
return;
}
const jobsToScan = [];
listItems.forEach((item, index) => {
const titleEl = item.querySelector('.job-card-list__title, .artdeco-entity-lockup__title');
const companyEl = item.querySelector('.job-card-container__primary-description, .artdeco-entity-lockup__subtitle');
if (titleEl && companyEl) {
jobsToScan.push({
index: index,
title: titleEl.textContent.trim().replace(/\n/g, ''),
company: companyEl.textContent.trim().replace(/\n/g, ''),
element: item
});
}
});
if (!jobsToScan.length) {
alert('Could not parse job titles.');
return;
}
document.querySelectorAll('.lja-badge').forEach(b => b.remove());
const listDataStr = JSON.stringify(jobsToScan.map(j => ({ index: j.index, title: j.title, company: j.company })));
const settings = await getSettings();
if (!settings.apiKey) {
alert('Please set your API key in the extension popup first.');
return;
}
if (typeof buildPromptV2 !== 'function') {
alert('buildPromptV2 not found. Extension error.');
return;
}
const promptStr = buildPromptV2('list_analysis', { skills: [], listData: listDataStr }, settings.userProfile, settings.language);
const response = await fetch(
\`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=\${settings.apiKey}\`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
contents: [{ parts: [{ text: promptStr }] }],
generationConfig: { maxOutputTokens: 2048, temperature: 0.1 }
})
}
);
if (!response.ok) throw new Error('API Request failed');
const data = await response.json();
let resultText = data.candidates[0].content.parts[0].text;
resultText = resultText.replace(/\`\`\`json/g, '').replace(/\`\`\`/g, '').trim();
let results;
try {
results = JSON.parse(resultText);
} catch(e) {
console.error(resultText);
throw new Error('Failed to parse AI response');
}
results.forEach(res => {
const jobItem = jobsToScan.find(j => j.index === res.index);
if (jobItem) {
const badge = document.createElement('div');
badge.className = 'lja-badge';
badge.style.cssText = \`
display: inline-block;
padding: 4px 8px;
border-radius: 6px;
font-size: 11px;
font-weight: bold;
margin-top: 6px;
color: white;
width: 100%;
box-sizing: border-box;
\`;
if (res.verdict === 'YES') {
badge.style.background = 'linear-gradient(135deg, #00d67e, #00a65e)';
badge.innerHTML = \`✅ MATCH: \${res.reason}\`;
} else if (res.verdict === 'NO') {
badge.style.background = 'linear-gradient(135deg, #ff4d6d, #d90429)';
badge.innerHTML = \`❌ SKIP: \${res.reason}\`;
} else {
badge.style.background = 'linear-gradient(135deg, #ffb347, #ff9200)';
badge.innerHTML = \`⚠️ MAYBE: \${res.reason}\`;
}
const contentContainer = jobItem.element.querySelector('.artdeco-entity-lockup__content');
if (contentContainer) contentContainer.appendChild(badge);
}
});
}
// ─── SPA Navigation Observer ─────────────────────────────────────────────
let lastUrl = location.href;
@@ -970,7 +1113,7 @@ Brief honest assessment of this opportunity for my profile`
const old = document.getElementById('lja-root');
if (old) old.remove();
window.__linkedinAnalyzerLoaded = false;
setTimeout(injectOverlay, 1200);
setTimeout(() => { injectOverlay(); injectListScanner(); }, 1200);
}
// Watch for URL changes (SPA navigation + job switches)
@@ -1006,9 +1149,9 @@ Brief honest assessment of this opportunity for my profile`
function init() {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => setTimeout(injectOverlay, 1000));
document.addEventListener('DOMContentLoaded', () => setTimeout(() => { injectOverlay(); injectListScanner(); }, 1000));
} else {
setTimeout(injectOverlay, 1000);
setTimeout(() => { injectOverlay(); injectListScanner(); }, 1000);
}
}

View File

@@ -114,7 +114,7 @@
<div class="clear"></div>
</div>
<ul>
<li>Led the full-stack architecture of a smart transportation ecosystem supporting 1,800+ drivers and 2,500+ riders.</li>
<li>Led the full-stack architecture of a smart transportation ecosystem supporting 1,440+ drivers and 2,811+ riders.</li>
<li>Built a proprietary mapping platform (IntaleqMaps) on OpenStreetMap, eliminating reliance on Google Maps API and saving $10,000+/month in operational costs.</li>
<li>Designed secure, custom payment infrastructure for environments lacking standard payment APIs, ensuring high-availability transaction integrity.</li>
</ul>
@@ -123,11 +123,11 @@
<div class="job-block">
<div class="job-header">
<div class="job-title">Co-Founder & Lead Developer — Tripz Egypt</div>
<div class="job-meta">Jan 2024 Present | Cairo / Remote</div>
<div class="job-meta">Jan 2023 Present | Cairo / Remote</div>
<div class="clear"></div>
</div>
<ul>
<li>Architected Egypt's homegrown ride-hailing platform, managing the entire distributed ecosystem with real-time tracking and dispatching.</li>
<li>Architected Egypt's homegrown ride-hailing platform, managing the entire distributed ecosystem with real-time tracking for 4,318 drivers and 2,464 riders.</li>
<li>Implemented robust microservices for real-time driver/rider matching and route optimization using event-driven architecture.</li>
</ul>
</div>
@@ -139,7 +139,7 @@
<div class="clear"></div>
</div>
<ul>
<li>Delivered 25+ production enterprise applications across GIS, FinTech, HR, and utilities for clients across the MENA region.</li>
<li>Delivered 25+ production enterprise applications with over $5M+ combined project scope across GIS, FinTech, HR, and utilities for clients across the MENA region.</li>
<li>Integrated AI vision models for document analysis (KYC) and automated invoice processing pipelines.</li>
</ul>
</div>
@@ -168,10 +168,10 @@
<ul>
<li><strong>BS Mathematics (Applied Computing & Algorithms)</strong>, Mutah University (20032007)</li>
<li>Google Data Analytics Professional Certificate</li>
<li>IBM Data Analyst Professional Certificate</li>
<li>Meta Back-End Developer & Mobile Development Certificates (Django, APIs, Version Control)</li>
<li>IBM Data Science Professional Certificate</li>
<li>Meta Back-End Developer & Mobile Development Certificates</li>
<li>Databases and SQL for Data Science with Python (IBM)</li>
<li><em>Total of 51 professional certifications across software engineering, databases, and enterprise architecture.</em></li>
<li>AWS Cloud Practitioner & Cloud Architecture Fundamentals</li>
</ul>
<div class="section-title">Languages</div>

View File

@@ -26,6 +26,7 @@ function buildPromptV2(tab, job, userProfile, language) {
${analysisLang}
Evaluate this job against my profile with brutal honesty and EXTREME brevity.
DO NOT recount my history, military background, or summarize my profile. Keep it actionable and short.
CRITICAL RULE: The user is actively seeking to step down from Architect/CTO roles to "Senior Software Engineer" (Flutter, Backend, Full Stack) to gain corporate Agile experience. DO NOT reject jobs for being a "downgrade" if they are Senior level and match his tech stack (Flutter, Python, PHP, Node).
${prof}
@@ -177,6 +178,20 @@ Respond EXACTLY:
## OVERALL RATING: X/10
**Worth applying?** [YES / MAYBE / NO]
[2-3 sentence honest assessment]`;
P.list_analysis = `You are an AI pre-screening jobs.
I will give you a JSON array of jobs (Title, Company).
My stack: Flutter, Python (FastAPI), PHP, Node.js, GIS, Technical Architect.
I am actively seeking Senior Engineer, Tech Lead, or Architect roles.
Reject Java, C#, C++, .NET, or pure Product Management roles.
JOBS LIST:
${job.listData}
Respond ONLY with a raw JSON array of objects, one for each job, containing:
[
{ "index": number, "verdict": "YES" | "NO" | "MAYBE", "reason": "Short reason" }
]
Do not wrap in markdown \`\`\`json blocks.`;
return P[tab] || P.analysis;
}

View File

@@ -114,7 +114,7 @@
<div class="clear"></div>
</div>
<ul>
<li>Led the full-stack architecture of a smart transportation ecosystem supporting 1,800+ drivers and 2,500+ riders.</li>
<li>Led the full-stack architecture of a smart transportation ecosystem supporting 1,440+ drivers and 2,811+ riders.</li>
<li>Built a proprietary mapping platform (IntaleqMaps) on OpenStreetMap, eliminating reliance on Google Maps API and saving $10,000+/month in operational costs.</li>
<li>Designed secure, custom payment infrastructure for environments lacking standard payment APIs, ensuring high-availability transaction integrity.</li>
</ul>
@@ -123,11 +123,11 @@
<div class="job-block">
<div class="job-header">
<div class="job-title">Co-Founder & Lead Developer — Tripz Egypt</div>
<div class="job-meta">Jan 2024 Present | Cairo / Remote</div>
<div class="job-meta">Jan 2023 Present | Cairo / Remote</div>
<div class="clear"></div>
</div>
<ul>
<li>Architected Egypt's homegrown ride-hailing platform, managing the entire distributed ecosystem with real-time tracking and dispatching.</li>
<li>Architected Egypt's homegrown ride-hailing platform, managing the entire distributed ecosystem with real-time tracking for 4,318 drivers and 2,464 riders.</li>
<li>Implemented robust microservices for real-time driver/rider matching and route optimization using event-driven architecture.</li>
</ul>
</div>
@@ -139,7 +139,7 @@
<div class="clear"></div>
</div>
<ul>
<li>Delivered 25+ production enterprise applications across GIS, FinTech, HR, and utilities for clients across the MENA region.</li>
<li>Delivered 25+ production enterprise applications with over $5M+ combined project scope across GIS, FinTech, HR, and utilities for clients across the MENA region.</li>
<li>Integrated AI vision models for document analysis (KYC) and automated invoice processing pipelines.</li>
</ul>
</div>
@@ -168,10 +168,10 @@
<ul>
<li><strong>BS Mathematics (Applied Computing & Algorithms)</strong>, Mutah University (20032007)</li>
<li>Google Data Analytics Professional Certificate</li>
<li>IBM Data Analyst Professional Certificate</li>
<li>Meta Back-End Developer & Mobile Development Certificates (Django, APIs, Version Control)</li>
<li>IBM Data Science Professional Certificate</li>
<li>Meta Back-End Developer & Mobile Development Certificates</li>
<li>Databases and SQL for Data Science with Python (IBM)</li>
<li><em>Total of 51 professional certifications across software engineering, databases, and enterprise architecture.</em></li>
<li>AWS Cloud Practitioner & Cloud Architecture Fundamentals</li>
</ul>
<div class="section-title">Languages</div>

View File

@@ -61,8 +61,8 @@ if ($action === 'generatePdf') {
$prompt = "You are an expert ATS CV tailor. Read the following job description and generate tailored content for my CV to maximize my chances of getting an interview.
Return ONLY a valid JSON object with EXACTLY three keys: 'headline', 'summary', and 'skills'.
The 'headline' should be a 5-6 word professional title relevant to the job.
The 'summary' should be a 3-sentence powerful paragraph highlighting skills relevant to the job.
The 'headline' should be a clean, confident title like 'Senior Solutions Architect', 'Enterprise Architect', or 'Senior Software Engineer' (do NOT use clunky, stuffed titles like 'Senior Enterprise Solution Architect Leader').
The 'summary' MUST open with a powerful hook: 'Built two production ride-hailing platforms from zero to thousands of users, on proprietary infrastructure, in sanctioned markets.' Then use the next 2 sentences to seamlessly tie my relevant skills and achievements to the job description requirements. Avoid generic boilerplate.
The 'skills' should be a comma-separated list of 10 highly relevant ATS keywords.
Do NOT use markdown blocks like ```json, just return raw JSON text.