diff --git a/orchestrator/src/server/db/migrate.ts b/orchestrator/src/server/db/migrate.ts index 0a9f721..b6a7906 100644 --- a/orchestrator/src/server/db/migrate.ts +++ b/orchestrator/src/server/db/migrate.ts @@ -133,6 +133,8 @@ const migrations = [ `ALTER TABLE jobs ADD COLUMN vacancy_count INTEGER`, `ALTER TABLE jobs ADD COLUMN work_from_home_type TEXT`, `ALTER TABLE jobs ADD COLUMN selected_project_ids TEXT`, + `ALTER TABLE jobs ADD COLUMN tailored_headline TEXT`, + `ALTER TABLE jobs ADD COLUMN tailored_skills TEXT`, `CREATE INDEX IF NOT EXISTS idx_jobs_status ON jobs(status)`, `CREATE INDEX IF NOT EXISTS idx_jobs_discovered_at ON jobs(discovered_at)`, diff --git a/orchestrator/src/server/db/schema.ts b/orchestrator/src/server/db/schema.ts index 1c1286f..1c92141 100644 --- a/orchestrator/src/server/db/schema.ts +++ b/orchestrator/src/server/db/schema.ts @@ -59,6 +59,8 @@ export const jobs = sqliteTable('jobs', { suitabilityScore: real('suitability_score'), suitabilityReason: text('suitability_reason'), tailoredSummary: text('tailored_summary'), + tailoredHeadline: text('tailored_headline'), + tailoredSkills: text('tailored_skills'), selectedProjectIds: text('selected_project_ids'), pdfPath: text('pdf_path'), notionPageId: text('notion_page_id'), diff --git a/orchestrator/src/server/pipeline/orchestrator.ts b/orchestrator/src/server/pipeline/orchestrator.ts index 2a13f75..1dd0ed0 100644 --- a/orchestrator/src/server/pipeline/orchestrator.ts +++ b/orchestrator/src/server/pipeline/orchestrator.ts @@ -14,7 +14,7 @@ import { runCrawler } from '../services/crawler.js'; import { runJobSpy } from '../services/jobspy.js'; import { runUkVisaJobs } from '../services/ukvisajobs.js'; import { scoreJobSuitability } from '../services/scorer.js'; -import { generateSummary } from '../services/summary.js'; +import { generateTailoring } from '../services/summary.js'; import { generatePdf } from '../services/pdf.js'; import { getSetting } from '../repositories/settings.js'; import { pickProjectIdsForJob } from '../services/projectSelection.js'; @@ -391,13 +391,18 @@ export async function summarizeJob( const profile = await loadProfile(DEFAULT_PROFILE_PATH); - // 1. Generate Summary + // 1. Generate Summary & Tailoring let tailoredSummary = job.tailoredSummary; - if (!tailoredSummary || options?.force) { - console.log(' Generating summary...'); - const summaryResult = await generateSummary(job.jobDescription || '', profile); - if (summaryResult.success) { - tailoredSummary = summaryResult.summary ?? null; + let tailoredHeadline = job.tailoredHeadline; + let tailoredSkills = job.tailoredSkills; + + if (!tailoredSummary || !tailoredHeadline || options?.force) { + console.log(' Generating tailoring (summary, headline, skills)...'); + const tailoringResult = await generateTailoring(job.jobDescription || '', profile); + if (tailoringResult.success && tailoringResult.data) { + tailoredSummary = tailoringResult.data.summary; + tailoredHeadline = tailoringResult.data.headline; + tailoredSkills = JSON.stringify(tailoringResult.data.skills); } } @@ -429,6 +434,8 @@ export async function summarizeJob( await jobsRepo.updateJob(job.id, { tailoredSummary: tailoredSummary ?? undefined, + tailoredHeadline: tailoredHeadline ?? undefined, + tailoredSkills: tailoredSkills ?? undefined, selectedProjectIds: selectedProjectIds ?? undefined, }); @@ -459,7 +466,11 @@ export async function generateFinalPdf( const pdfResult = await generatePdf( job.id, - job.tailoredSummary || '', + { + summary: job.tailoredSummary || '', + headline: job.tailoredHeadline || '', + skills: job.tailoredSkills ? JSON.parse(job.tailoredSkills) : [] + }, job.jobDescription || '', DEFAULT_PROFILE_PATH, job.selectedProjectIds diff --git a/orchestrator/src/server/services/pdf.ts b/orchestrator/src/server/services/pdf.ts index 9e12bf9..8c822e4 100644 --- a/orchestrator/src/server/services/pdf.ts +++ b/orchestrator/src/server/services/pdf.ts @@ -27,18 +27,24 @@ export interface PdfResult { error?: string; } +export interface TailoredPdfContent { + summary?: string | null; + headline?: string | null; + skills?: any | null; // Accept any for flexibility, expected to be items array or parsed JSON +} + /** * Generate a tailored PDF resume for a job. * - * @param jobId - Unique job identifier (used for filename) - * @param tailoredSummary - The AI-generated summary to inject - * @param jobDescription - Job description text for project selection - * @param baseResumePath - Path to the base resume JSON (optional) - * @param selectedProjectIds - Comma-separated list of selected project IDs (optional manual override) + * @param jobId - Unique job identifier + * @param tailoredContent - Content to inject (summary, headline, skills) + * @param jobDescription - Job description (for project selection) + * @param baseResumePath - Optional path to base JSON + * @param selectedProjectIds - Optional overrides */ export async function generatePdf( jobId: string, - tailoredSummary: string, + tailoredContent: TailoredPdfContent, jobDescription: string, baseResumePath?: string, selectedProjectIds?: string | null @@ -57,10 +63,34 @@ export async function generatePdf( const baseResume = JSON.parse(await readFile(resumeJsonPath, 'utf-8')); // Inject tailored summary - if (baseResume.sections?.summary) { - baseResume.sections.summary.content = tailoredSummary; - } else if (baseResume.basics?.summary) { - baseResume.basics.summary = tailoredSummary; + if (tailoredContent.summary) { + if (baseResume.sections?.summary) { + baseResume.sections.summary.content = tailoredContent.summary; + } else if (baseResume.basics?.summary) { + baseResume.basics.summary = tailoredContent.summary; + } + } + + // Inject tailored headline + if (tailoredContent.headline) { + if (baseResume.basics) { + // Support both standard JSON Resume 'label' and RxResume 'headline' + baseResume.basics.headline = tailoredContent.headline; + baseResume.basics.label = tailoredContent.headline; + } + } + + // Inject tailored skills + if (tailoredContent.skills) { + const newSkills = Array.isArray(tailoredContent.skills) + ? tailoredContent.skills + : typeof tailoredContent.skills === 'string' + ? JSON.parse(tailoredContent.skills) + : null; + + if (newSkills && baseResume.sections?.skills) { + baseResume.sections.skills.items = newSkills; + } } // Select projects (manual override OR locked + AI-picked) and set visibility for RXResume diff --git a/orchestrator/src/server/services/summary.ts b/orchestrator/src/server/services/summary.ts index aab4279..8359068 100644 --- a/orchestrator/src/server/services/summary.ts +++ b/orchestrator/src/server/services/summary.ts @@ -1,43 +1,37 @@ /** - * Service for generating tailored resume summaries. - * Wraps the existing Python generate_summary.py script. + * Service for generating tailored resume content (Summary, Headline, Skills). */ -import { spawn } from 'child_process'; -import { join, dirname } from 'path'; -import { fileURLToPath } from 'url'; -import { writeFile, unlink } from 'fs/promises'; -import { randomUUID } from 'crypto'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); -const RESUME_GEN_DIR = join(__dirname, '../../../../resume-generator'); - const OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/chat/completions'; -export interface SummaryResult { +export interface TailoredData { + summary: string; + headline: string; + skills: any[]; +} + +export interface TailoringResult { success: boolean; - summary?: string; + data?: TailoredData; error?: string; } /** - * Generate a tailored resume summary for a job. - * Uses the native implementation instead of calling Python. + * Generate tailored resume content (summary, headline, skills) for a job. */ -export async function generateSummary( +export async function generateTailoring( jobDescription: string, profile: Record -): Promise { +): Promise { const apiKey = process.env.OPENROUTER_API_KEY; if (!apiKey) { - console.warn('⚠️ OPENROUTER_API_KEY not set, cannot generate summary'); + console.warn('⚠️ OPENROUTER_API_KEY not set, cannot generate tailoring'); return { success: false, error: 'API key not configured' }; } const model = process.env.MODEL || 'openai/gpt-4o-mini'; - - const prompt = buildSummaryPrompt(profile, jobDescription); + const prompt = buildTailoringPrompt(profile, jobDescription); try { const response = await fetch(OPENROUTER_API_URL, { @@ -51,6 +45,7 @@ export async function generateSummary( body: JSON.stringify({ model, messages: [{ role: 'user', content: prompt }], + response_format: { type: 'json_object' }, }), }); @@ -59,104 +54,110 @@ export async function generateSummary( } const data = await response.json(); - const summary = data.choices[0]?.message?.content; + const content = data.choices[0]?.message?.content; - if (!summary) { + if (!content) { throw new Error('No content in response'); } - return { success: true, summary: sanitizeTailoredSummary(summary) }; + const parsed = JSON.parse(content); + + // Basic validation + if (!parsed.summary || !parsed.headline || !Array.isArray(parsed.skills)) { + console.warn('⚠️ AI response missing required fields:', parsed); + } + + return { + success: true, + data: { + summary: sanitizeText(parsed.summary || ''), + headline: sanitizeText(parsed.headline || ''), + skills: parsed.skills || [] + } + }; } catch (error) { const message = error instanceof Error ? error.message : 'Unknown error'; return { success: false, error: message }; } } -function buildSummaryPrompt(profile: Record, jd: string): string { - return ` -You are generating a tailored résumé summary for me. - -Requirements: -- Use keywords found in the job description. -- Keep it concise but meaningful. Avoid fluff. Avoid long-winded text. -- Include just enough detail to feel real and grounded. -- Gently convey that I care about helping people and doing good work. -- Do NOT invent experience or skills I don't have. -- Maintain a warm, confident, human tone. -- Target THIS specific job directly, so use ATS keywords, while remaining natural. -- Use the profile to add context and details. - -My profile (JSON fields merged): -${JSON.stringify(profile, null, 2)} - -Job description: -${jd} - -Write the résumé summary now. -`; -} - /** - * Alternative: Call the Python script directly. - * Useful if the Python script has additional functionality. + * Backwards compatibility wrapper if needed, or alias. */ -export async function generateSummaryViaPython( - jobDescription: string -): Promise { - const tempFile = join(RESUME_GEN_DIR, `temp_jd_${randomUUID()}.txt`); - - try { - // Write JD to temp file - await writeFile(tempFile, jobDescription); - - // Call Python script - const result = await new Promise((resolve, reject) => { - let output = ''; - let error = ''; - - const child = spawn('python3', ['generate_summary.py', '--file', tempFile], { - cwd: RESUME_GEN_DIR, - env: { ...process.env }, - }); - - child.stdout.on('data', (data) => { - output += data.toString(); - }); - - child.stderr.on('data', (data) => { - error += data.toString(); - }); - - child.on('close', (code) => { - if (code === 0) { - resolve(output); - } else { - reject(new Error(error || `Process exited with code ${code}`)); - } - }); - - child.on('error', reject); - }); - - return { success: true, summary: sanitizeTailoredSummary(result) }; - } catch (error) { - const message = error instanceof Error ? error.message : 'Unknown error'; - return { success: false, error: message }; - } finally { - // Cleanup temp file - try { - await unlink(tempFile); - } catch { - // Ignore cleanup errors - } - } +export async function generateSummary( + jobDescription: string, + profile: Record +): Promise<{ success: boolean; summary?: string; error?: string }> { + // If we just need summary, we can discard the rest (or cache it? but here we just return summary) + const result = await generateTailoring(jobDescription, profile); + return { + success: result.success, + summary: result.data?.summary, + error: result.error + }; } -function sanitizeTailoredSummary(summary: string): string { - const withoutBoldPreface = summary.replace(/\*\*[\s\S]*?\*\*/g, ''); - return withoutBoldPreface - .replace(/^\s*[-–—:]+\s*/g, '') - .replace(/[ \t]{2,}/g, ' ') - .replace(/\n{3,}/g, '\n\n') +function buildTailoringPrompt(profile: Record, jd: string): string { + // Extract only needed parts of profile to save tokens + const relevantProfile = { + basics: { + name: (profile as any).basics?.name, + label: (profile as any).basics?.label, // Original headline + summary: (profile as any).basics?.summary, + }, + skills: (profile as any).sections?.skills || (profile as any).skills, + projects: (profile as any).sections?.projects?.items?.map((p: any) => ({ + name: p.name, + description: p.description, + keywords: p.keywords + })), + experience: (profile as any).sections?.experience?.items?.map((e: any) => ({ + company: e.company, + position: e.position, + summary: e.summary + })) + }; + + return ` +You are an expert resume writer tailoring a profile for a specific job application. +You must return a JSON object with three fields: "headline", "summary", and "skills". + +JOB DESCRIPTION: +${jd.slice(0, 3000)} ... (truncated if too long) + +MY PROFILE: +${JSON.stringify(relevantProfile, null, 2)} + +INSTRUCTIONS: + +1. "headline" (String): + - CRITICAL: This is the #1 ATS factor. + - It must match the Job Title from the JD exactly (e.g., if JD says "Senior React Dev", use "Senior React Dev"). + - If the JD title is very generic, you may add one specialty, but keep it matching the role. + +2. "summary" (String): + - The Hook. This needs to mirror the company's "About You" / "What we're looking for" section. + - Keep it concise, warm, and confident. + - Do NOT invent experience. + - Use the profile to add context. + +3. "skills" (Array of Objects): + - Review my existing skills section structure. + - Keyword Stuffing: Swap synonyms to match the JD exactly (e.g. "TDD" -> "Unit Testing", "ReactJS" -> "React"). + - Keep my original skill levels and categories, just rename/reorder keywords to prioritize JD terms. + - Return the full "items" array for the skills section, preserving the structure: { "name": "Frontend", "keywords": [...] }. + +OUTPUT FORMAT (JSON): +{ + "headline": "...", + "summary": "...", + "skills": [ ... ] +} +`; +} + +function sanitizeText(text: string): string { + return text + .replace(/\*\*[\s\S]*?\*\*/g, '') // remove markdown bold .trim(); } diff --git a/orchestrator/src/shared/types.ts b/orchestrator/src/shared/types.ts index 964f5ab..43aaf92 100644 --- a/orchestrator/src/shared/types.ts +++ b/orchestrator/src/shared/types.ts @@ -44,6 +44,8 @@ export interface Job { suitabilityScore: number | null; // 0-100 AI-generated score suitabilityReason: string | null; // AI explanation tailoredSummary: string | null; // Generated resume summary + tailoredHeadline: string | null; // Generated resume headline + tailoredSkills: string | null; // Generated resume skills (JSON) selectedProjectIds: string | null; // Comma-separated IDs of selected projects pdfPath: string | null; // Path to generated PDF notionPageId: string | null; // Notion page ID if synced @@ -133,6 +135,8 @@ export interface UpdateJobInput { suitabilityScore?: number; suitabilityReason?: string; tailoredSummary?: string; + tailoredHeadline?: string; + tailoredSkills?: string; selectedProjectIds?: string; pdfPath?: string; notionPageId?: string; diff --git a/resume-generator/base.bak.json b/resume-generator/base.bak.json new file mode 100644 index 0000000..b0f0195 --- /dev/null +++ b/resume-generator/base.bak.json @@ -0,0 +1,661 @@ +{ + "basics": { + "name": "Shaheer Sarfaraz", + "headline": "Frontend Software Engineer (React/TypeScript) \u00b7 Autodesk Intern \u00b7 Open Source & Product Work", + "email": "shaheer30sarfaraz@gmail.com", + "phone": "+44 7359 501592", + "location": "Blackpool, United Kingdom", + "url": { + "label": "https://dakheera47.com/", + "href": "https://dakheera47.com/" + }, + "customFields": [], + "picture": { + "url": "", + "size": 120, + "aspectRatio": 1, + "borderRadius": 0, + "effects": { + "hidden": false, + "border": false, + "grayscale": false + } + } + }, + "sections": { + "summary": { + "name": "Summary", + "columns": 1, + "separateLinks": true, + "visible": true, + "id": "summary", + "content": "

I\u2019m a BSc (Hons) Computer Science student at the University of Lancashire, graduating in June 2026 with a First-class average, and I\u2019ve spent a year as a Software Engineering Intern at Autodesk working in a large React/TypeScript production codebase. I\u2019m comfortable using Python for scripting, data cleaning, and small backend services, and I have academic experience with SQL from my databases module, which I\u2019ve applied in analytics-focused side projects. I\u2019m particularly interested in AI-driven systems and would be excited to help develop and improve AI agents for marketing and user acquisition while working closely with data scientists, engineers, and marketing/product teams

" + }, + "awards": { + "name": "Awards", + "columns": 1, + "separateLinks": true, + "visible": true, + "id": "awards", + "items": [] + }, + "certifications": { + "name": "Certifications", + "columns": 1, + "separateLinks": true, + "visible": true, + "id": "certifications", + "items": [] + }, + "education": { + "name": "Education", + "columns": 1, + "separateLinks": true, + "visible": true, + "id": "education", + "items": [ + { + "id": "yo3p200zo45c6cdqc6a2vtt3", + "visible": true, + "institution": "University of Lancashire", + "studyType": "BSc (Hons) Computer Science", + "area": "Preston, United Kingdom", + "score": "1st Class", + "date": "September 2022 to June 2026", + "summary": "

Relevant Modules: Web Applications, Algorithms & Data Structures, Game Development, Databases, Software Engineering (Agile group project)

", + "url": { + "label": "", + "href": "https://www.lancashire.ac.uk/undergraduate/courses/computer-science-bsc" + } + }, + { + "id": "ei2fvjokusg3cfmdyolmgcoz", + "visible": false, + "institution": " ", + "studyType": "", + "area": "A Levels", + "score": "", + "date": "", + "summary": "
  • Maths: A

  • Computer Science: B

  • Physics: C

  • Chemistry: E

", + "url": { + "label": "", + "href": "" + } + }, + { + "id": "pm4r5hngvv1w4mc79o22irfx", + "visible": false, + "institution": " ", + "studyType": "", + "area": "GCSEs", + "score": "", + "date": "", + "summary": "
  1. English: A*

  2. Computer Science: A*

  3. Urdu: A

  4. Islamiat: A

  5. Pakistan Studies: A

  6. Biology: A

  7. Chemistry: A

  8. Physics: A

  9. Maths: A

", + "url": { + "label": "", + "href": "" + } + } + ] + }, + "experience": { + "name": "Experience", + "columns": 1, + "separateLinks": true, + "visible": true, + "id": "experience", + "items": [ + { + "id": "ng9ui2azk7w4y8oyu8kazqeb", + "visible": true, + "company": "Autodesk", + "position": "Software Engineering Intern", + "location": "Hybrid (Sheffield Based)", + "date": "July 2024 - June 2025", + "summary": "
  • Implemented front-end features and fixes in the Autodesk Construction Cloud Model Coordination app, working in a ~10-year-old React/JavaScript/TypeScript codebase (7k+ commits) using Webpack module federation and Autodesk\u2019s Exoskeleton dev environment

  • Improved reliability of the Cypress end-to-end test suite by diagnosing flaky tests, adding new E2E coverage, and participating in focused \u201ctest fest\u201d events ahead of major feature releases

  • Collaborated with cross-functional teams (like the Design System, platform teams) by raising well-scoped bugs, augmenting existing tickets with reproduction steps and context, and aligning on shared component and API changes

  • Helped strengthen team processes by running weekly stand-ups and retrospectives, organising a ticket-scoping meeting, and participating in technical reviews & ADR discussions (e.g. standardising error handling and planning clash data streaming)

", + "url": { + "label": "", + "href": "" + } + }, + { + "id": "lhw25d7gf32wgdfpsktf6e0x", + "visible": true, + "company": "Mirage", + "position": "Co-Founder & Lead Developer", + "location": "", + "date": "December 2019 to Present", + "summary": "
  • Delivered 10+ production websites and webapps for small and medium size clients (e.g. Indus Marine Services, Mumtaz Urdu), from initial scoping to deployment and handover

  • Built with modern web stacks (Next.js, Node/Express, Tailwind, Strapi, WordPress/Elementor where appropriate), setting up CI/CD and hosting

  • Led a small team of four developers, handling code reviews, task breakdown, and client communication

", + "url": { + "label": "", + "href": "https://promirage.com/" + } + }, + { + "id": "k6zxqunkb225hbjso3c3vykk", + "visible": true, + "company": "University of Lancashire", + "position": "Computing Student Mentor", + "location": "Preston, UK", + "date": "July 2023 - July 2024", + "summary": "
  • Academic Support and Leadership: Provided academic guidance to over 10 first-year students once a week, significantly enhancing their understanding and skills in key subjects like programming and web development.

  • Collaborative Learning Environment: Actively fostered a collaborative and supportive learning environment for a group of 10 students. This role also honed my leadership and communication skills, facilitating better academic outcomes for mentees.

", + "url": { + "label": "", + "href": "" + } + }, + { + "id": "a1bg5d8gp8sulf91xzdcsiaq", + "visible": true, + "company": "Research and Knowledge Exchange Institute", + "position": "Undergraduate Research Intern (HCI & EdTech)", + "location": "", + "date": "Summer 2024", + "summary": "
  • Built a mouse \u201ctorch-reveal\u201d web app (Astro) to approximate eye-tracking; ran on-campus studies with Revoe Learning Academy pupils\u20141 eye-tracked, 9 using my app.

  • Logged cursor paths, dwell time, and reveal order; delivered setup notes for staff to run sessions independently.

  • Developed a Questionnaire Randomiser (Next.js): selectable response metrics (smileys / numbers / stars), configurable randomisation strategies, and ZIP export of per-student PDFs ready for print.

  • Extras: lightweight analytics for comparison with the eye-tracking baseline; optional CSV/JSON data export.

", + "url": { + "label": "", + "href": "" + } + }, + { + "id": "tx32suzrg2bs5eumcbjei4ns", + "visible": false, + "company": "University of Lancashire", + "position": "Student Ambassador", + "location": "Preston, UK", + "date": "July 2023 - Present", + "summary": "
  • Diverse Role Engagement: Actively engaged in various tasks, from guiding tours to assisting on open days, demonstrating adaptability and organizational skills.

  • Campus Culture Promotion: Contributed to enhancing the university\u2019s inclusive campus atmosphere, showcasing the university's vibrant community to prospective students.

", + "url": { + "label": "", + "href": "" + } + } + ] + }, + "volunteer": { + "name": "Volunteering", + "columns": 1, + "separateLinks": true, + "visible": true, + "id": "volunteer", + "items": [] + }, + "interests": { + "name": "Interests", + "columns": 1, + "separateLinks": true, + "visible": false, + "id": "interests", + "items": [] + }, + "languages": { + "name": "Languages", + "columns": 1, + "separateLinks": true, + "visible": true, + "id": "languages", + "items": [] + }, + "profiles": { + "name": "Profiles", + "columns": 1, + "separateLinks": true, + "visible": true, + "id": "profiles", + "items": [ + { + "id": "ukl0uecvzkgm27mlye0wazlb", + "visible": true, + "network": "GitHub", + "username": "DaKheera47", + "icon": "github", + "url": { + "label": "", + "href": "https://github.com/DaKheera47" + } + }, + { + "id": "cnbk5f0aeqvhx69ebk7hktwd", + "visible": true, + "network": "LinkedIn", + "username": "ssarfaraz30", + "icon": "linkedin", + "url": { + "label": "", + "href": "https://www.linkedin.com/in/ssarfaraz30/" + } + }, + { + "id": "linnyxv78zdep1xwirpa2ia1", + "visible": true, + "network": "Hashnode", + "username": "DaKheera47", + "icon": "hashnode", + "url": { + "label": "", + "href": "https://dakheera47.hashnode.dev/" + } + } + ] + }, + "projects": { + "name": "Projects", + "columns": 1, + "separateLinks": true, + "visible": true, + "id": "projects", + "items": [ + { + "id": "yw843emozcth8s1ubi1ubvlf", + "visible": false, + "name": "Atoro", + "description": "Lead Developer", + "date": "January 2023", + "summary": "
  1. Next.js Implementation for Enhanced SEO: Utilized Next.js to optimize the website for search engines, significantly improving its online visibility and user engagement.

  2. Strapi Backend Integration: Streamlined content management by implementing a Strapi backend, enhancing the efficiency and scalability of the website's content updates.

  3. Responsive Design with Tailwind CSS: Employed Tailwind CSS for a utility-first approach, ensuring the website's responsiveness and seamless user experience across various devices.

  4. Continuous Deployment Pipeline Establishment: Developed a continuous deployment pipeline, ensuring real-time updates and maintaining high performance and reliability of the website.

  5. Optimized Web Performance: Focused on optimizing web performance by efficiently loading images and managing JavaScript bundles, leading to a faster and more efficient user experience.

", + "keywords": [], + "url": { + "label": "", + "href": "https://atoro.promirage.com" + } + }, + { + "id": "ncxgdjjky54gh59iz2t1xi1v", + "visible": false, + "name": "Stellar Consultancy", + "description": "Lead Developer", + "date": "April 2023", + "summary": "
  1. WordPress and Elementor Integration: Expertly utilized WordPress with Elementor to build a robust content management system, enhancing the website's scalability and user interaction capabilities.

  2. Client Engagement and Trust Building: Implemented features to showcase client testimonials, effectively building trust and displaying the success of previous project engagements.

  3. Intuitive Design and User Engagement: Focused on intuitive page design and structuring, streamlining site maintenance and content updates, thereby enhancing user engagement.

  4. Effective Call-to-Actions: Crafted clear call-to-actions and provided essential contact information, significantly improving user interaction and conversion rates.

  5. Portfolio Display for Business Showcase: Presented past work and services offered through a comprehensive portfolio display, allowing visitors to assess the quality and impact of Stellar Consultancy's services.

", + "keywords": [], + "url": { + "label": "", + "href": "https://stellarconsultancy.ca" + } + }, + { + "id": "tcecguinuctb8mu2xqrn97m8", + "visible": true, + "name": "Mumtaz Urdu", + "description": "Developer", + "date": "July 2022", + "summary": "
  1. Server-Rendered Web Application Development: Created the Mumtaz Urdu platform with Next.js to optimize server-side rendering for enhanced SEO and performance.

  2. UI Development with Tailwind CSS: Implemented utility-first Tailwind CSS, ensuring rapid, responsive design for a seamless user interface.

  3. Scalable Storage Solution: Integrated scalable Amazon S3 storage, supporting the application's growth and robust data management.

  4. Progressive Web App Implementation: Developed PWA features for Mumtaz Urdu, offering users native-like mobile access and increased engagement.

  5. High Traffic Data Management: Engineered Mumtaz Urdu's backend with Next.js and MongoDB, enabling the handling and efficient processing of vast amounts of user data for thousands of monthly users.

  6. Test-Driven Development: Embraced TDD practices to ensure reliable and high-quality code, facilitating regular testing throughout the development process for continuous improvement.

", + "keywords": [], + "url": { + "label": "", + "href": "https://www.mumtazurdu.com/" + } + }, + { + "id": "to47h749kaj6t02j3f9kprxq", + "visible": false, + "name": "PyScreeze", + "description": "Open Source Contribution", + "date": "January 2022", + "summary": "
  1. Innovative Feature Implementation: Implemented the locateCenterOnScreenNear function for PyScreeze, enhancing the library's functionality by enabling precise image location near a specified point on the screen.

  2. Open Source Contribution: Marked my debut in open-source contributions with this significant addition to PyScreeze, showcasing my initiative and ability to contribute effectively to community-driven projects.

  3. Collaborative Development and Recognition: Collaborated with the project's maintainer, asweigart, to refine and integrate the function into the main codebase, receiving recognition for this valuable contribution to the project.

", + "keywords": [], + "url": { + "label": "", + "href": "https://github.com/asweigart/pyscreeze/pull/79" + } + }, + { + "id": "gt7yq82ulor5hmmutdhuvfo1", + "visible": false, + "name": "Threegency", + "description": "Lead Developer", + "date": "February 2023", + "summary": "
  • Framework: Utilized Next.js to build a server-rendered React website, enhancing SEO and ensuring optimal performance.

  • Styling: Employed Tailwind CSS for utility-first styling, facilitating rapid UI development.

  • Content Management: Leveraged Strapi as a CMS, enabling streamlined content updates and administration.

  • Data Handling: Utilized GraphQL for data handling, ensuring efficient and flexible data retrieval.

", + "keywords": [], + "url": { + "label": "", + "href": "https://www.threegency.com" + } + }, + { + "id": "c8fcu3nz541a4d5zcurx6b8c", + "visible": false, + "name": "AutoClass", + "description": "GUI Automation", + "date": "November 2021", + "summary": "
  • Framework: Written in Python, leveraging the versatility and ease-of-use of the language.

  • Automation Library: Utilized PyAutoGUI for automating user interactions, enhancing the utility of the application.

  • Iterative Improvement: Progressively refined over a year, demonstrating a commitment to robustness and reliability.

  • Project Purpose: Developed to automate the process of joining Zoom classes, alleviating the repetitive morning routine.

", + "keywords": [], + "url": { + "label": "", + "href": "https://github.com/DaKheera47/autoclass" + } + }, + { + "id": "rv23bgibq6bye6rujmcx1ygc", + "visible": false, + "name": "Meet Link Generator", + "description": "GUI Automation", + "date": "January 2022", + "summary": "
  • Functionality: Generates Google Meet links with specific words in the URL by brute-forcing the creation of thousands of links until the desired pattern is achieved. Doing so enables creation of Google Meet links with specific codes or phrases.

  • Optimized Automation: The final product uses Python with PyAutoGUI for efficient and rapid creation of new Google Meet links.

  • Speed and Efficiency: Drastically improved performance, finally achieving the link generation time to under 1 second per link, limited only by internet speed.

  • Interface Interaction: Utilizes the Google Meet homepage's features for quicker link generation, avoiding full page refreshes for speed.

", + "keywords": [], + "url": { + "label": "", + "href": "https://github.com/DaKheera47/meet-link-generator" + } + }, + { + "id": "tu98rghbi5c43ogget5mh7ih", + "visible": false, + "name": "UCLan Server-side Web Application Project", + "description": "", + "date": "UCLan Year 1", + "summary": "
  • Backend Development with PHP and MySQL: Developed the backend for a Student\u2019s Union Shop web application, integrating PHP and MySQL for dynamic data handling and backend database communication.

  • User Authentication and Session Management: Implemented user sign-up and login functionality using PHP sessions, enabling secure and personalized shopping experiences.

  • Dynamic Content Display from Database: Enhanced the application to dynamically display products and offers directly from the database, moving away from static HTML content.

  • Advanced Search and Personalization Features: Integrated advanced product search capabilities and personalized user greetings, improving user interactivity and engagement.

", + "keywords": [], + "url": { + "label": "", + "href": "" + } + }, + { + "id": "ov4lkbc1vl169ynfnj91m1lm", + "visible": false, + "name": "Square About", + "description": "", + "date": "UCLan Year 1", + "summary": "
  • Advanced 3D Game Development: Implemented a complex 3D game using TL-Engine, featuring intricate gameplay mechanics and immersive 3D visuals.

  • Dynamic Gameplay Elements: Integrated multiple spheres with varying behaviors, including super-spheres requiring multiple hits, enhancing the game's challenge and engagement levels.

  • Interactive Game Controls: Developed features for speed control and directional change, allowing players to interact dynamically with the game environment.

  • Strategic Game Mechanics: Added a bullet firing mechanism with a limited ammo concept, introducing strategic elements and a scoring system to the gameplay.

", + "keywords": [], + "url": { + "label": "", + "href": "" + } + }, + { + "id": "s3r37gdr0oa84a6dp6r5nl58", + "visible": false, + "name": "Car Smash", + "description": "", + "date": "UCLan Year 1", + "summary": "
  1. 3D Car Smash Game Development: Developed a 3D car smash game using TL-Engine, showcasing skills in game engine utilization and 3D gaming.

  2. Collision Detection Mechanics: Implemented advanced collision detection between player's car and enemy vehicles, enhancing gameplay realism.

  3. Dynamic Game States and Camera Views: Integrated multiple game states and camera views, including a chase camera and first-person view, for an immersive gaming experience.

  4. Enhanced Player Interaction: Created a more realistic driving experience with accelerated movement and bounce effects on collisions, and introduced particle systems for visual effects.

", + "keywords": [], + "url": { + "label": "", + "href": "" + } + }, + { + "id": "gylzkvl103m9s7ywag4xpdy4", + "visible": false, + "name": "Tweet Filter", + "description": "", + "date": "UCLan Year 1", + "summary": "
  1. Tweet Filtration System: Crafted a C++ program to filter out prohibited words from tweets, showcasing text processing and file handling capabilities.

  2. Advanced Text Manipulation: Enhanced the program to filter varying cases and contexts of banned words, even within larger strings, demonstrating attention to detail in string operations.

  3. Output Generation: Implemented functionality to write filtered tweets to new files, maintaining data integrity and displaying proficiency in file I/O operations.

  4. Algorithm Optimization: Utilized data structures like vectors and implemented mathematical techniques for efficient word frequency analysis and sentiment determination.

", + "keywords": [], + "url": { + "label": "", + "href": "" + } + }, + { + "id": "enav754zxhuc9uycbb83s94q", + "visible": false, + "name": "Burger Ordering App", + "description": "", + "date": "UCLan Year 1", + "summary": "
  1. Interactive Console Application: Engineered a C++ console application simulating a burger ordering process, highlighting proficiency in creating user-interactive software.

  2. Complex Logic Implementation: Designed and implemented complex logic for burger size and topping selection, including pricing and order summary features.

  3. Data Handling and User Input: Developed robust credit system and user input validation for an intuitive ordering experience, showcasing attention to detail and user-centric design.

  4. Readable and Maintainable Code: Produced well-documented, maintainable code with clear variable naming and structured formatting, demonstrating best practices in software development.

", + "keywords": [], + "url": { + "label": "", + "href": "" + } + }, + { + "id": "hl6jgeswr01tlul3iwoat05d", + "visible": false, + "name": "LinkLander", + "description": "Android Studio, Kotlin", + "date": "December 2023 - Ongoing", + "summary": "
  • Innovative Android Utility: Developed LinkLander, a Kotlin-based Android application that simplifies the process of downloading online content directly to devices.

  • User-Centric Design: Focused on addressing Android system limitations by providing a seamless shortcut for redirecting links to an online video downloading service.

  • Simplicity and Efficiency: Emphasized a user-friendly interface, enhancing the Android experience by streamlining content downloads.

  • Technical Proficiency in Kotlin: Leveraged the capabilities of Kotlin for Android development to create a practical solution for niche digital tasks.

", + "keywords": [], + "url": { + "label": "", + "href": "" + } + }, + { + "id": "v4s0ljbiiio198y8l1wl0ym6", + "visible": false, + "name": "AR App Development with AGILE", + "description": "Unity, C#", + "date": "October 2023 - Ongoing", + "summary": "
  • Agile Development in Action: Participated in an Agile team project, developing an AR application for supporting disabled students with a team of five, demonstrating an application of Agile methodologies in a real-world scenario.

  • Mobile AR Application Prototype: Developed a proof-of-concept prototype using Unity and C# for mobile platforms, showcasing technical skills in modern app development environments.

  • Collaborative Software Engineering: Engaged in a collaborative environment, contributing code and ideas, emphasizing teamwork and shared responsibility in software creation.

  • Presentation and Critical Analysis: Delivered a comprehensive presentation and critical report, evaluating the Agile process, product development, and personal learning outcomes.

", + "keywords": [], + "url": { + "label": "", + "href": "" + } + }, + { + "id": "fwxrq682hqrj1y76rmziqrbk", + "visible": true, + "name": "Indus Marine Services", + "description": "System Design & Development", + "date": "May 2022 - Ongoing", + "summary": "
  1. Induction System for Marine Services: Designed & developed an induction system for Indus Marine Services in the UAE, streamlining the employee onboarding process with interactive testing and certification issuance.

  2. Admin-Centric Functionality: Devised a back-end system allowing admins to oversee inductee progress, manage documents, and curate customized quizzes as per requirements

  3. Client Engagement Interface: Implemented a user-friendly front-end where inductees receive personalized email prompts, complete quizzes, and obtain certifications, all contributing to a seamless induction experience.

  4. Robust Tech Stack Integration: Utilized a sophisticated stack comprising Node.js, Express, EJS, and Tailwind CSS to build a responsive, scalable, and easily navigable system.

", + "keywords": [], + "url": { + "label": "", + "href": "http://www.ims-auh.com" + } + }, + { + "id": "jdfyaez8vq1b7xfr9rmxmz06", + "visible": false, + "name": "VECTOR AI", + "description": "Website Development", + "date": "February 2024 - February 2024", + "summary": "
  1. Innovative AI Development: As the driving force behind VECTOR's website development, I spearheaded the technical design using Astro, with a cutting-edge stack including React and Tailwind CSS.

  2. Data-Driven Content Strategy: Leveraged Astro content management capabilities to structure and present data, ensuring content is dynamic, easily accessible, and optimized for both performance and scalability.

  3. Astro for Enhanced Performance: Utilized Astro for static site generation, making VECTOR's website performance fast for a pleasant user experience

  4. React for Responsive Interaction: Utilized React\u2019s robust ecosystem to develop interactive elements, ensuring that each module of VECTOR\u2019s platform is engaging and seamless for users across various touchpoints.

", + "keywords": [], + "url": { + "label": "", + "href": "https://vector-ai.co/" + } + }, + { + "id": "qdhmfkqpfql19ohfas1g91ek", + "visible": false, + "name": "UCLan's First Hackathon", + "description": "Hackathon, Team Work", + "date": "February 2024", + "summary": "
  1. Second Place in UCLan Hackathon: Earned second place in UCLan's first hackathon by developing an app to simplify university life. Focused on enhancing the attendance monitoring process for student mentors.

  2. TRPC for End-to-End Type Safety: Utilized TRPC to ensure end-to-end type safety, enhancing the app's reliability and streamlining the development process.

  3. Supabase Backend Integration: Implemented Supabase as a backend solution, providing a robust and scalable database for managing attendance data efficiently.

  4. Amazon SES and OAuth Integration: Integrated Amazon SES for email notifications and OAuth for secure Google login, improving user experience and communication.

", + "keywords": [], + "url": { + "label": "", + "href": "" + } + }, + { + "id": "rw3x7tapntrt877rbl4pnxz7", + "visible": true, + "name": "NASA Space Apps Challenge", + "description": "A 48-hour, global hackathon powered by NASA open data", + "date": "Oct 4\u20135, 2025", + "summary": "
  1. Full-Stack Integration: Wired up backend services to a responsive frontend, enabling real-time exploration of Kepler/K2/TESS catalogs and smooth model-scoring UX.

  2. Data Harmonization Pipeline: Cleaned, merged, and standardized multi-mission catalogs into a unified schema, unblocking ML teammates and cutting data-prep time by 60%+ during the hack.

  3. Analytics UI & Upload Flow: Built an upload \u2192 validate \u2192 score workflow and a clear results dashboard so researchers can triage candidates in minutes, not hours.

  4. Delivery Under Pressure: Coordinated a 5-person multidisciplinary team to ship a working web app in 48 hours, with demo-ready reliability for judging.

", + "keywords": [], + "url": { + "label": "", + "href": "https://exploranium.vercel.app/dashboard" + } + }, + { + "id": "i2t6epmx5v7s0d8rqtxsigp3", + "visible": true, + "name": "Strong Statistics", + "description": "Self-hosted strength analytics app using FastAPI and Next.js to visualize Strong app data with full local privacy and active open-source adoption.", + "date": "September 2025 - Present", + "summary": "
  1. Self-Hosted Strength Analytics Platform: Developed strong-statistics, an open-source web app that visualizes detailed workout analytics from the Strong and Hevy fitness app, giving users local control of their training data.

  2. Full-Stack Architecture: Built a modular stack with FastAPI, Next.js, Tailwind CSS, and SQLite, deployed via Docker Compose for seamless self-hosting and persistent local data storage.

  3. Active Open-Source Ecosystem: Published on GitHub with community engagement from global users \u2014 external contributors opened feature requests and bug reports, validating real-world adoption and reliability.

  4. Continuous Personal Use & Maintenance: Regularly updated and used in live deployment at lifting.dakheera47.com, tracking hundreds of sets over time with persistent analytics and performance trends.

", + "keywords": [], + "url": { + "label": "", + "href": "https://lifting.dakheera47.com/" + } + } + ] + }, + "publications": { + "name": "Publications", + "columns": 1, + "separateLinks": true, + "visible": true, + "id": "publications", + "items": [] + }, + "references": { + "name": "References", + "columns": 1, + "separateLinks": true, + "visible": false, + "id": "references", + "items": [ + { + "id": "f2sv5z0cce6ztjl87yuk8fak", + "visible": true, + "name": "Available upon request", + "description": "", + "summary": "", + "url": { + "label": "", + "href": "" + } + } + ] + }, + "skills": { + "name": "Skills", + "columns": 2, + "separateLinks": true, + "visible": true, + "id": "skills", + "items": [ + { + "id": "jfgzfcwcg65k9gemuxlfe9m3", + "visible": true, + "name": "Frontend Development", + "description": "", + "level": 0, + "keywords": [ + "React", + "Next.js", + "Tailwind CSS", + "Strapi CMS", + "Elementor", + "GraphQL", + "TypeScript", + "CI/CD", + "PWA Development", + "AstroJS", + "React Testing Library" + ] + }, + { + "id": "sk3957foopxir2hw4xzxqahh", + "visible": true, + "name": "Backend Development", + "description": "", + "level": 0, + "keywords": [ + "Node.js", + "Express.js", + "MongoDB", + "Supabase", + "Firebase", + "Docker", + "FastAPI", + "AWS S3", + "AWS SES" + ] + }, + { + "id": "d9bddwdj6qreknhk644rm0bs", + "visible": true, + "name": "Leadership and Problem-Solving", + "description": "", + "level": 0, + "keywords": [ + "Agile Project Management", + "Conflict Resolution", + "Creative Problem-Solving", + "Decision-Making", + "Effective Communication", + "Adaptability" + ] + }, + { + "id": "gk4hrky0wnbsbdcmmud48zjh", + "visible": true, + "name": "Other Programming", + "description": "", + "level": 0, + "keywords": [ + "Python Scripting", + "PyAutoGUI", + "Git", + "GitHub", + "Selenium", + "Data Analysis", + "Web Scraping", + "Data Cleaning" + ] + } + ] + }, + "custom": {} + }, + "metadata": { + "template": "onyx", + "layout": [ + [ + [ + "summary", + "education", + "experience", + "projects", + "references" + ], + [ + "profiles", + "skills", + "certifications", + "interests", + "languages", + "awards", + "volunteer", + "publications" + ] + ] + ], + "css": { + "value": "* {\n\toutline: 1px solid #000;\n\toutline-offset: 4px;\n}", + "visible": false + }, + "page": { + "margin": 34, + "format": "a4", + "options": { + "breakLine": false, + "pageNumbers": false + } + }, + "theme": { + "background": "#ffffff", + "text": "#000000", + "primary": "#475569" + }, + "typography": { + "font": { + "family": "IBM Plex Sans", + "subset": "latin", + "variants": [ + "regular" + ], + "size": 13 + }, + "lineHeight": 1.75, + "hideIcons": false, + "underlineLinks": true + }, + "notes": "" + } +} \ No newline at end of file