Auto-deploy: 2026-08-05 17:26:03
This commit is contained in:
+54
-19
@@ -71,15 +71,21 @@ const PROFILE_DATA = {
|
||||
// counts trail: a few thousand riders is a small number to anyone who knows
|
||||
// this market, so it belongs in context (see achievementsAtAGlance) rather
|
||||
// than as the first claim on the page.
|
||||
// Each entry is a complete clause, not a label glued to a number. The earlier
|
||||
// "<value> <label>" form produced ungrammatical fragments ("8 apps Built and
|
||||
// launched across…") that read as broken to a human and parse poorly.
|
||||
// `lead` is the scannable metric; `rest` completes the sentence.
|
||||
//
|
||||
// "across 2 platforms" (inherited from the master CV) is deliberately spelled
|
||||
// out: models and recruiters both read it as "iOS and Android app stores"
|
||||
// rather than "the Tripz and Intaleq platforms".
|
||||
headlineMetrics: [
|
||||
// "across 2 platforms" (inherited from the master CV) is ambiguous: models
|
||||
// and recruiters both read it as "iOS and Android app stores" rather than
|
||||
// "the Tripz and Intaleq platforms". Naming the two platforms removes a
|
||||
// claim that was never made.
|
||||
{ value: '8 apps', label: 'Built and launched across 2 ride-hailing platforms (Tripz, Intaleq)' },
|
||||
{ value: '<4 months', label: 'Zero to live operations (Tripz, full ecosystem)' },
|
||||
{ value: '$10K+/mo', label: 'Map infrastructure cost eliminated (~80% reduction)' },
|
||||
{ value: '5,750+', label: 'Drivers onboarded across 2 markets' }
|
||||
{ lead: '8 applications', rest: 'engineered and launched across 2 ride-hailing platforms (Tripz, Intaleq)' },
|
||||
{ lead: 'Under 4 months', rest: 'from zero to live operations for the full Tripz ecosystem' },
|
||||
// NOT "eliminated ... (~80% reduction)": a cost cannot be both removed
|
||||
// entirely and reduced by a percentage. The spend was cut, not zeroed.
|
||||
{ lead: '~80% lower', rest: 'third-party mapping API spend — over $10,000/month — via self-hosted infrastructure' },
|
||||
{ lead: '5,750+ drivers', rest: 'onboarded across 2 markets' }
|
||||
],
|
||||
|
||||
achievementsAtAGlance: [
|
||||
@@ -95,16 +101,20 @@ const PROFILE_DATA = {
|
||||
'Mobile & Architecture': [
|
||||
'Flutter', 'Dart', 'GetX', 'Provider', 'Clean Architecture',
|
||||
'Offline-First Design', 'REST APIs', 'State Management', 'Native Android (Java)',
|
||||
'iOS / Android Release Management'
|
||||
'iOS / Android Release Management', 'Firebase Cloud Messaging (FCM)',
|
||||
'Push Notifications', 'Background Location Tracking'
|
||||
],
|
||||
// Named tools, not capability phrases. An ATS matches "GraphHopper", not
|
||||
// "Routing Engines" — the generic wording was costing keyword matches on
|
||||
// every geo-heavy posting.
|
||||
'Real-Time & Geo Systems': [
|
||||
'WebSockets', 'Real-Time Dispatching', 'Live Tracking', 'Self-Hosted Maps',
|
||||
'Map Tiles', 'Polylines', 'Routing Engines', 'Geospatial Queries',
|
||||
'High-Latency Network Optimization'
|
||||
'WebSockets', 'Real-Time Dispatching', 'Live Tracking', 'GraphHopper',
|
||||
'PostGIS', 'Martin (vector tile server)', 'OpenStreetMap (OSM)', 'MapLibre GL',
|
||||
'Self-Hosted Map Tiles', 'Geospatial Queries', 'High-Latency Network Optimization'
|
||||
],
|
||||
'Backend & DevOps': [
|
||||
'PHP', 'Laravel', 'MySQL', 'Docker', 'Linux', 'Nginx',
|
||||
'CI/CD (Gitea)', 'Infrastructure Cost Optimization', 'Self-Hosted Infrastructure'
|
||||
'PHP', 'Laravel', 'PostgreSQL', 'MySQL', 'Redis', 'Docker', 'Linux', 'Nginx',
|
||||
'Git', 'CI/CD (Gitea)', 'Infrastructure Cost Optimization', 'Self-Hosted Infrastructure'
|
||||
],
|
||||
'Security & FinTech': [
|
||||
'Payment Gateway Integration (7+ providers)', 'HMAC Security', 'RASP',
|
||||
@@ -112,6 +122,24 @@ const PROFILE_DATA = {
|
||||
]
|
||||
},
|
||||
|
||||
// ── OPEN SLOT: engineering scale metrics ─────────────────────────────────
|
||||
// Every number on this CV is commercial (riders, drivers, cost). None is an
|
||||
// engineering number, which is the weakest point remaining in a profile that
|
||||
// sells real-time systems expertise. Driver count does not demonstrate
|
||||
// concurrency; concurrent connections do.
|
||||
//
|
||||
// Measure these on Intaleq, then paste ONE as a bullet on the Tripz or
|
||||
// Intaleq role. Never estimate — an invented figure is the single easiest
|
||||
// thing to get caught on in a systems interview:
|
||||
// • peak concurrent WebSocket connections
|
||||
// • location updates ingested per second (peak)
|
||||
// • trips dispatched per day (peak)
|
||||
// • p95 dispatch latency, driver ping to rider screen
|
||||
//
|
||||
// Template, once measured:
|
||||
// 'Sustained N concurrent WebSocket connections and M location updates per
|
||||
// second at peak, holding p95 dispatch latency under X ms on mobile
|
||||
// networks averaging Y ms RTT.'
|
||||
experience: [
|
||||
{
|
||||
company: 'Intaleq',
|
||||
@@ -122,7 +150,7 @@ const PROFILE_DATA = {
|
||||
// Tagged so the tailoring engine can pick the 3-4 most job-relevant
|
||||
// bullets instead of always printing the same ones.
|
||||
bullets: [
|
||||
{ text: 'Launched a ride-hailing platform in a high-constraint market (Syria), reaching 2,811 riders and 1,440 drivers within the first two months.', tags: ['leadership', 'delivery', 'mobility', 'scale'] },
|
||||
{ text: 'Solely architected and launched a ride-hailing platform in a high-constraint market (Syria), reaching 2,811 riders and 1,440 drivers within the first two months.', tags: ['leadership', 'ownership', 'delivery', 'mobility', 'scale'] },
|
||||
{ text: 'Designed and implemented Rider, Driver, Admin and Customer Support applications.', tags: ['mobile', 'flutter', 'architecture'] },
|
||||
{ text: 'Built a custom payment helper application to integrate legacy, non-API local payment gateways, enabling reliable driver balance top-ups despite infrastructure limitations.', tags: ['fintech', 'payments', 'integration'] },
|
||||
{ text: 'Leveraged fully self-hosted map tiles and routing engines to eliminate dependency on expensive third-party mapping APIs, keeping operational costs near zero.', tags: ['geo', 'cost', 'infrastructure'] },
|
||||
@@ -145,9 +173,12 @@ const PROFILE_DATA = {
|
||||
start: 'Jan 2024',
|
||||
end: 'Dec 2024',
|
||||
bullets: [
|
||||
{ text: 'Built and launched a complete ride-hailing ecosystem (Rider, Driver, Admin, Customer Support apps plus backend API) in under four months, scaling to 2,464 riders and 4,318 drivers.', tags: ['delivery', 'leadership', 'mobility', 'scale', 'flutter'] },
|
||||
{ text: 'Designed real-time dispatch and live tracking using WebSockets, optimized for high-latency MENA network environments.', tags: ['realtime', 'websockets', 'geo'] },
|
||||
{ text: 'Eliminated over $10,000/month in third-party mapping API spend (~80% reduction) by self-hosting map tiles, routing logic and polyline generation on dedicated servers.', tags: ['geo', 'cost', 'infrastructure'] },
|
||||
// Solo delivery stated outright. Reviewers read the absence of team
|
||||
// detail as a gap in leadership; naming it as sole ownership turns the
|
||||
// same fact into the stronger signal it actually is.
|
||||
{ text: 'Solely architected, built and launched a complete ride-hailing ecosystem (Rider, Driver, Admin, Customer Support apps plus backend API) in under four months, scaling to 2,464 riders and 4,318 drivers.', tags: ['delivery', 'leadership', 'ownership', 'mobility', 'scale', 'flutter'] },
|
||||
{ text: 'Designed the real-time dispatch and live tracking architecture on WebSockets with Redis-backed state, sustaining continuous driver location streams over high-latency MENA mobile networks.', tags: ['realtime', 'websockets', 'geo', 'architecture', 'scale'] },
|
||||
{ text: 'Cut third-party mapping API spend by approximately 80% — over $10,000/month — by self-hosting map tiles, routing logic and polyline generation on dedicated servers.', tags: ['geo', 'cost', 'infrastructure'] },
|
||||
{ text: 'Replaced traditional call-center hardware by engineering a secure, mobile-first Customer Support application, enabling support agents to operate entirely remotely.', tags: ['mobile', 'product', 'cost'] },
|
||||
{ text: 'Automated driver onboarding through AI-powered KYC integration, reducing manual review time and minimizing fraudulent registrations.', tags: ['ai', 'automation', 'fintech', 'security'] },
|
||||
{ text: 'Implemented API-level HMAC security, anti-tampering mechanisms and Fake GPS detection to protect geo-spatial and financial data.', tags: ['security', 'geo', 'fintech'] },
|
||||
@@ -224,6 +255,10 @@ const PROFILE_DATA = {
|
||||
'Docker, Linux, Nginx, self-hosted CI/CD'
|
||||
],
|
||||
limitedIn: [
|
||||
'NO formal people management: no direct reports, no hiring, no performance reviews. ' +
|
||||
'Both platforms were architected and built SOLO. Leadership here is technical — ' +
|
||||
'architecture ownership, end-to-end delivery, stakeholder alignment — never headcount. ' +
|
||||
'Do not frame this profile for Engineering Manager roles.',
|
||||
'AI is limited to INTEGRATING third-party vision/LLM APIs (KYC automation, Gemini API). ' +
|
||||
'No model training, no MLOps, no deep learning research.',
|
||||
'Cloud experience is self-hosted/VPS-centric — not deep AWS/GCP/Azure managed-service experience.',
|
||||
@@ -270,7 +305,7 @@ function renderProfileText(p = PROFILE_DATA) {
|
||||
lines.push('TARGET ROLES: ' + p.targetRoles.join(' | '));
|
||||
lines.push('');
|
||||
lines.push('HEADLINE METRICS:');
|
||||
p.headlineMetrics.forEach(m => lines.push(`- ${m.value} — ${m.label}`));
|
||||
p.headlineMetrics.forEach(m => lines.push(`- ${m.lead} ${m.rest}`));
|
||||
lines.push('');
|
||||
lines.push('AT A GLANCE:');
|
||||
p.achievementsAtAGlance.forEach(a => lines.push(`- ${a}`));
|
||||
|
||||
+28
-2
@@ -210,6 +210,14 @@ companies, enterprises, banks, agencies and government. This controls whether my
|
||||
CV presents a past role as "Founding Mobile Architect" or "Lead Mobile Engineer" —
|
||||
identical work, framed for the reader.
|
||||
|
||||
PEOPLE-MANAGEMENT RULE: both platforms were built solo. NEVER write "led a team",
|
||||
"managed engineers", "mentored juniors", "grew the team" or any headcount claim —
|
||||
there were no direct reports. Express leadership as sole ownership instead:
|
||||
"solely architected", "owned end-to-end", "sole technical decision-maker",
|
||||
"aligned architecture with business stakeholders". If the posting is an
|
||||
Engineering Manager role requiring people management, say so in
|
||||
"ats_keywords_missing" rather than manufacturing the experience.
|
||||
|
||||
CONSISTENCY RULE: when "is_founding_or_startup_role" is false, the words
|
||||
"Founding" and "Founder" must NOT appear anywhere in "headline" or "summary"
|
||||
either. Describe the same 0-to-1 ownership as "built and launched from zero" or
|
||||
@@ -306,10 +314,28 @@ PROMPT;
|
||||
// the title are identical either way.
|
||||
$isFoundingContext = $integrityClean && !empty($ai['is_founding_or_startup_role']);
|
||||
|
||||
// "Core Focus" carries the job's exact wording and earns its place at the
|
||||
// top. Repeating those same terms verbatim in the group lines below does
|
||||
// NOT help ATS scoring — parsers score the document, and within-section
|
||||
// repetition adds nothing — while it visibly reads as padding. So the group
|
||||
// lines render as the remaining inventory, with the promoted terms removed.
|
||||
$coreTokens = array_filter(array_map(
|
||||
fn($s) => strtolower(trim($s)),
|
||||
explode(',', $coreSkills)
|
||||
));
|
||||
|
||||
$skillsBlock = '';
|
||||
foreach ($profile['skills'] as $group => $items) {
|
||||
$remaining = array_values(array_filter(
|
||||
$items,
|
||||
fn($item) => !in_array(strtolower(trim($item)), $coreTokens, true)
|
||||
));
|
||||
// A group emptied entirely by the promotion is already fully represented
|
||||
// in Core Focus; printing an empty heading would just look broken.
|
||||
if (empty($remaining)) continue;
|
||||
|
||||
$skillsBlock .= '<p class="skill-line"><span class="label">' . e($group) . ':</span> '
|
||||
. e(implode(', ', $items)) . '</p>';
|
||||
. e(implode(', ', $remaining)) . '</p>';
|
||||
}
|
||||
|
||||
// Index the AI's per-role selections so we can fall back role-by-role.
|
||||
@@ -366,7 +392,7 @@ PROMPT;
|
||||
// bullets they cost four lines to say what one line says.
|
||||
$metricParts = [];
|
||||
foreach ($profile['headlineMetrics'] as $m) {
|
||||
$metricParts[] = '<strong>' . e($m['value']) . '</strong> ' . e($m['label']);
|
||||
$metricParts[] = '<strong>' . e($m['lead']) . '</strong> ' . e($m['rest']);
|
||||
}
|
||||
$achievements = '<p class="metrics">' . implode(' · ', $metricParts) . '</p>';
|
||||
|
||||
|
||||
+33
-20
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user