358 lines
19 KiB
JavaScript
358 lines
19 KiB
JavaScript
// profile_data.js — SINGLE SOURCE OF TRUTH
|
||
// ============================================================================
|
||
// Every prompt, CV, cover letter and comment in this extension derives from
|
||
// this file. Nothing else may hardcode job titles, metrics, dates or contacts.
|
||
//
|
||
// Synced from: cvs/ATS-safe résumé template.pdf (master CV).
|
||
// If the master CV changes, change THIS file — then nothing else needs editing.
|
||
// A mirror copy lives at server/profile.json for the PHP backend.
|
||
// ============================================================================
|
||
|
||
const PROFILE_DATA = {
|
||
identity: {
|
||
fullName: 'Hamza Ayed',
|
||
primaryTitle: 'Senior Mobile Architect',
|
||
positioningLine: 'Ride-Hailing & Real-Time Systems · FinTech in Emerging Markets',
|
||
location: 'Amman, Jordan',
|
||
phone: '+962 798 583 052',
|
||
email: 'hamzaayedflutter@gmail.com',
|
||
linkedin: 'linkedin.com/in/hamza-ayed',
|
||
github: 'github.com/Hamza-Ayed',
|
||
portfolio: 'intaleqapp.com/hamza.html',
|
||
productSite: 'tripz-egypt.com',
|
||
languages: 'Arabic (Native), English (Professional Working Proficiency)',
|
||
availability: 'Available immediately. Open to Remote, Hybrid and Relocation (GCC / MENA / Europe).'
|
||
},
|
||
|
||
// Titles the CV/headline generator is ALLOWED to use. Anything outside this
|
||
// list is a fabrication risk — see integrity rules in prompts.js.
|
||
allowedTitles: [
|
||
'Senior Mobile Architect',
|
||
'Senior Mobile Engineer',
|
||
'Lead Mobile Engineer',
|
||
'Senior Flutter Developer',
|
||
'Lead Flutter Engineer',
|
||
'Mobile Technical Lead',
|
||
'Founding Engineer (Mobile)',
|
||
'Senior Software Engineer (Mobile)'
|
||
],
|
||
|
||
// Titles that would overstate or misrepresent the record.
|
||
forbiddenTitles: [
|
||
'CTO',
|
||
'Solutions Architect',
|
||
'Senior AI Developer',
|
||
'Machine Learning Engineer',
|
||
'Data Scientist',
|
||
'DevOps Architect',
|
||
'Engineering Manager'
|
||
],
|
||
|
||
// Opens on what was built, not on a self-description. "Proven experience" and
|
||
// "Founding Engineer" were removed: the first is filler, and the second
|
||
// contradicts the standard (non-startup) title framing when this text is used
|
||
// as the fallback summary.
|
||
summary:
|
||
'Senior Mobile Architect who built and launched two production-grade ride-hailing platforms ' +
|
||
'(Tripz — Egypt, Intaleq — Syria) from zero to live operations. ' +
|
||
'Designed and delivered full mobility ecosystems including Rider, Driver, Admin and Customer Support ' +
|
||
'applications, along with backend APIs, security layers, DevOps pipelines and fintech integrations. ' +
|
||
'Specialized in real-time systems, self-hosted geo-services, high-latency optimization and ' +
|
||
'infrastructure cost reduction.',
|
||
|
||
targetRoles: [
|
||
'Senior / Lead Mobile Engineer',
|
||
'Mobile Architect',
|
||
'Founding Engineer (Mobility, Logistics, FinTech)'
|
||
],
|
||
|
||
// Headline metrics — ordered by how well they survive a sceptical reader.
|
||
// Delivery speed and breadth lead, because they are genuinely rare. Raw user
|
||
// 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: [
|
||
{ 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: [
|
||
'Tripz (Egypt): Scaled platform to 2,464 riders and 4,318 drivers. Built and launched 4 distinct apps ' +
|
||
'plus full backend in under 4 months with near-zero map infrastructure cost.',
|
||
'Intaleq (Syria): Acquired 2,811 riders and 1,440 drivers in the first 2 months. Engineered a custom ' +
|
||
'operational payment layer to bypass API limitations in a highly constrained market.'
|
||
],
|
||
|
||
// Grouped exactly as the master CV groups them. The ATS keyword selector may
|
||
// only choose from these values.
|
||
skills: {
|
||
'Mobile & Architecture': [
|
||
'Flutter', 'Dart', 'GetX', 'Provider', 'Clean Architecture',
|
||
'Offline-First Design', 'REST APIs', 'State Management', 'Native Android (Java)',
|
||
'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', 'GraphHopper',
|
||
'PostGIS', 'Martin (vector tile server)', 'OpenStreetMap (OSM)', 'MapLibre GL',
|
||
'Self-Hosted Map Tiles', 'Geospatial Queries', 'High-Latency Network Optimization'
|
||
],
|
||
'Backend & DevOps': [
|
||
'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',
|
||
'Fake GPS Detection', 'Anti-Tampering', 'KYC Automation'
|
||
]
|
||
},
|
||
|
||
// ── 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',
|
||
title: 'Senior Mobile Systems Architect',
|
||
location: 'MENA Region (Remote)',
|
||
start: 'Jan 2025',
|
||
end: 'Present',
|
||
// Tagged so the tailoring engine can pick the 3-4 most job-relevant
|
||
// bullets instead of always printing the same ones.
|
||
bullets: [
|
||
{ 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'] },
|
||
{ text: 'Designed an offline-first caching mechanism ensuring data integrity and uninterrupted driver–rider interactions during unstable network conditions.', tags: ['mobile', 'offline', 'reliability'] },
|
||
{ text: 'Optimized deployment cycles by 40% through a secure, self-hosted CI/CD pipeline using Gitea, ensuring data sovereignty and rapid release efficiency.', tags: ['devops', 'cicd', 'security'] }
|
||
]
|
||
},
|
||
{
|
||
company: 'Tripz',
|
||
title: 'Lead Mobile Engineer',
|
||
// "Founding" is an asset applying to a startup and a liability applying
|
||
// to an established company, where it reads as flight risk and as a
|
||
// self-awarded title that no HR department can verify. Same work, same
|
||
// facts — the generator picks the framing that fits the employer.
|
||
titleVariants: {
|
||
standard: 'Lead Mobile Engineer',
|
||
founding: 'Founding Mobile Architect'
|
||
},
|
||
location: 'Cairo, Egypt (Remote)',
|
||
start: 'Jan 2024',
|
||
end: 'Dec 2024',
|
||
bullets: [
|
||
// 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'] },
|
||
{ text: 'Collaborated closely with business stakeholders and operations teams to align product and architecture decisions with on-the-ground market realities.', tags: ['leadership', 'product', 'communication'] }
|
||
]
|
||
},
|
||
{
|
||
// Previously "Global Tech Projects" — an invented company name reads as a
|
||
// placeholder to any experienced recruiter, and it was covering seven of
|
||
// the nine years on this CV. Naming the arrangement honestly is weaker in
|
||
// sound and considerably stronger in credibility.
|
||
company: 'Independent Consultant',
|
||
title: 'Lead Mobile Engineer (Flutter / Native)',
|
||
location: 'Various Clients — MENA & Remote',
|
||
start: 'Jan 2017',
|
||
end: 'Dec 2023',
|
||
bullets: [
|
||
{ text: 'Delivered 30+ production-grade mobile applications across e-commerce, delivery, healthcare and news sectors, acting as technical decision-maker for early-stage clients.', tags: ['delivery', 'leadership', 'mobile', 'scale'] },
|
||
{ text: 'Migrated legacy Android (Java) applications to Flutter, cutting maintenance complexity and delivery timelines by roughly 50%.', tags: ['flutter', 'migration', 'mobile'] },
|
||
// Ordered by how often each is actually screened for in mobile roles.
|
||
// When the tailoring model returns fewer bullets than the page allows,
|
||
// the generator tops up in this order — so the more commonly required
|
||
// evidence fills the slot first.
|
||
{ text: 'Owned App Store and Google Play release management end-to-end, from store listings and review submission through versioned production rollout.', tags: ['mobile', 'release', 'ios', 'android', 'delivery'] },
|
||
{ text: 'Built custom Flutter plugins and tailored API layers to integrate with complex legacy backend systems.', tags: ['flutter', 'integration', 'architecture'] }
|
||
]
|
||
}
|
||
],
|
||
|
||
// Published packages are the single most verifiable credential a mobile
|
||
// engineer can offer. They matter more here than usual: none of the three
|
||
// employers on this CV is a recognisable brand a recruiter can call, so a
|
||
// one-click-checkable artefact carries the credibility the employer names
|
||
// cannot.
|
||
openSource: [
|
||
{
|
||
name: 'intaleq_maps',
|
||
platform: 'Flutter SDK — pub.dev',
|
||
url: 'pub.dev/packages/intaleq_maps',
|
||
description: 'Map rendering, offline tile caching and route plotting, optimised for low-bandwidth environments.'
|
||
},
|
||
{
|
||
name: 'intaleq-maps-gl',
|
||
platform: 'JavaScript library — npm',
|
||
url: 'npmjs.com/package/intaleq-maps-gl',
|
||
description: 'Mapbox GL compatible web library for custom OSM tiles and routing integration.'
|
||
}
|
||
],
|
||
|
||
education: {
|
||
degree: 'BSc Mathematics',
|
||
institution: "Mu'tah University, Jordan",
|
||
note: 'Applied mathematical foundations to state-machine design and geo-spatial routing.'
|
||
},
|
||
|
||
certifications: [
|
||
'IBM Data Analyst Professional Certificate',
|
||
'Google Data Analytics Professional Certificate',
|
||
'IBM Data Analytics with Excel and R Specialization'
|
||
],
|
||
|
||
// ── Honest capability boundaries ──────────────────────────────────────────
|
||
// Used to stop the model inventing experience. Keep this brutally accurate:
|
||
// it is the difference between a CV that survives a technical screen and one
|
||
// that does not.
|
||
boundaries: {
|
||
strongIn: [
|
||
'Flutter / Dart mobile architecture at production scale',
|
||
'Real-time systems: WebSockets, dispatching, live tracking',
|
||
'Self-hosted geo infrastructure: tiles, routing, polylines',
|
||
'Payment gateway integration and constrained-market fintech workarounds',
|
||
'Mobile-layer security: HMAC, anti-tampering, Fake GPS detection',
|
||
'PHP / Laravel / MySQL backend supporting mobile products',
|
||
'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.',
|
||
'No Kubernetes in production.',
|
||
'No native Swift/SwiftUI or Kotlin-first development — Flutter is the primary mobile path.',
|
||
'No data engineering (Spark, Hadoop, Airflow, warehouses).'
|
||
],
|
||
neverClaim: [
|
||
'TensorFlow', 'PyTorch', 'Scikit-learn', 'Spark', 'Hadoop', 'Kubernetes',
|
||
'MLOps', 'model training', 'NLP research', 'Swift', 'SwiftUI', 'Kotlin Multiplatform',
|
||
'blockchain', 'Salesforce', 'SAP'
|
||
]
|
||
},
|
||
|
||
// Voice rules — applied to cover letters, LinkedIn comments and posts.
|
||
voice: {
|
||
tone: 'Operator-level, calm, direct, evidence-first. Writes like someone who has shipped, not someone selling.',
|
||
banned: [
|
||
'I am writing to apply', 'I leverage my expertise', 'passionate about',
|
||
'proven track record', 'dynamic environment', 'synergy', 'game-changer',
|
||
'disruptive', 'serving millions', 'in the digital age', 'Great post',
|
||
'Well said', 'Couldn\'t agree more', 'This resonates',
|
||
'في العصر الرقمي', 'مما لا شك فيه', 'ختاماً', 'يعد من أهم'
|
||
],
|
||
neverMention: [
|
||
'military history or background',
|
||
'sanctions or politically sensitive framing of the Syria market',
|
||
'exact client names under NDA'
|
||
]
|
||
}
|
||
};
|
||
|
||
// Renders the structured profile into the plain-text block that prompts consume.
|
||
function renderProfileText(p = PROFILE_DATA) {
|
||
const id = p.identity;
|
||
const lines = [];
|
||
|
||
lines.push(`${id.fullName.toUpperCase()} — ${id.primaryTitle}`);
|
||
lines.push(id.positioningLine);
|
||
lines.push('');
|
||
lines.push('SUMMARY:');
|
||
lines.push(p.summary);
|
||
lines.push('');
|
||
lines.push('TARGET ROLES: ' + p.targetRoles.join(' | '));
|
||
lines.push('');
|
||
lines.push('HEADLINE METRICS:');
|
||
p.headlineMetrics.forEach(m => lines.push(`- ${m.lead} ${m.rest}`));
|
||
lines.push('');
|
||
lines.push('AT A GLANCE:');
|
||
p.achievementsAtAGlance.forEach(a => lines.push(`- ${a}`));
|
||
lines.push('');
|
||
lines.push('TECHNICAL SKILLS:');
|
||
Object.entries(p.skills).forEach(([group, items]) => {
|
||
lines.push(`- ${group}: ${items.join(', ')}`);
|
||
});
|
||
lines.push('');
|
||
lines.push('EXPERIENCE:');
|
||
p.experience.forEach(job => {
|
||
const alt = job.titleVariants
|
||
? ` (alternate framing for startup/founding roles: ${job.titleVariants.founding})`
|
||
: '';
|
||
lines.push(`- ${job.title} — ${job.company} | ${job.start} – ${job.end} | ${job.location}${alt}`);
|
||
job.bullets.forEach(b => lines.push(` • ${b.text}`));
|
||
});
|
||
lines.push('');
|
||
lines.push('OPEN SOURCE (published, verifiable):');
|
||
(p.openSource || []).forEach(o => {
|
||
lines.push(`- ${o.name} (${o.platform}) — ${o.url}. ${o.description}`);
|
||
});
|
||
lines.push('');
|
||
lines.push('EDUCATION:');
|
||
lines.push(`- ${p.education.degree}, ${p.education.institution}. ${p.education.note}`);
|
||
p.certifications.forEach(c => lines.push(`- ${c}`));
|
||
lines.push('');
|
||
lines.push('CAPABILITY BOUNDARIES (do not overstate):');
|
||
lines.push(' STRONG IN:');
|
||
p.boundaries.strongIn.forEach(s => lines.push(` + ${s}`));
|
||
lines.push(' LIMITED / NOT EXPERIENCED IN:');
|
||
p.boundaries.limitedIn.forEach(s => lines.push(` - ${s}`));
|
||
lines.push(' NEVER CLAIM: ' + p.boundaries.neverClaim.join(', '));
|
||
lines.push('');
|
||
lines.push(`LANGUAGES: ${id.languages}`);
|
||
lines.push(`LOCATION: ${id.location} — ${id.availability}`);
|
||
lines.push(`CONTACT: ${id.email} | ${id.phone} | ${id.linkedin} | ${id.github} | ${id.portfolio}`);
|
||
|
||
return lines.join('\n');
|
||
}
|
||
|
||
// Flat list of every legitimate skill token, for ATS keyword matching.
|
||
function allSkillTokens(p = PROFILE_DATA) {
|
||
return Object.values(p.skills).flat();
|
||
}
|
||
|
||
if (typeof module !== 'undefined' && module.exports) {
|
||
module.exports = { PROFILE_DATA, renderProfileText, allSkillTokens };
|
||
}
|