Minor improvements

This commit is contained in:
2025-12-26 14:18:02 +03:30
parent b818cf8226
commit b6a875b0d9
7 changed files with 5258 additions and 8125 deletions
+1 -1
View File
@@ -108,7 +108,7 @@ interface Props {
} }
const props = withDefaults(defineProps<Props>(), { const props = withDefaults(defineProps<Props>(), {
username: 'aliarghyani' username: 'mahdium'
}) })
// Detect mobile for accordion behavior (SSR-safe) // Detect mobile for accordion behavior (SSR-safe)
+193 -171
View File
@@ -3,257 +3,279 @@
* Based on RESUME-STANDARDS.md (docs/RESUME-STANDARDS.md) * Based on RESUME-STANDARDS.md (docs/RESUME-STANDARDS.md)
* Optimized for ATS and 2025 best practices * Optimized for ATS and 2025 best practices
* Version: 2.0 - 2-Page Resume (International Remote Positions) * Version: 2.0 - 2-Page Resume (International Remote Positions)
* *
* ⚠️ BEFORE EDITING: Give docs/RESUME-UPDATE-RULES.md to any AI agent * ⚠️ BEFORE EDITING: Give docs/RESUME-UPDATE-RULES.md to any AI agent
* *
* Quick command for AI: * Quick command for AI:
* "Read docs/RESUME-UPDATE-RULES.md and update my resume" * "Read docs/RESUME-UPDATE-RULES.md and update my resume"
*/ */
import type { Resume } from '~/types/resume' import type { Resume } from "~/types/resume";
export const resumeData: Resume = { export const resumeData: Resume = {
basics: { basics: {
name: 'Ali Arghyani', name: "Mohammad Mahdi Mohammadi",
label: 'Frontend Developer | Vue.js • Nuxt.js • TypeScript', label: "Frontend Developer | Vue.js • Nuxt.js • TypeScript",
image: '/img/AliProfile.webp', // image: '/img/AliProfile.webp',
email: 'aliarghyani@gmail.com', email: "me@mahdium.ir",
phone: '+98 912 322 0694', phone: "+98 990 787 5312",
url: 'https://aliarghyani.vercel.app', url: "https://mahdium.ir",
location: { location: {
city: 'Tehran', city: "Kerman",
country: 'Iran', country: "Iran",
}, },
profiles: [ profiles: [
{ {
network: 'LinkedIn', network: "Mastodon",
url: 'https://linkedin.com/in/aliarghyani', url: "https://mas.to/@mahdium",
icon: 'i-mdi-linkedin', icon: "i-mdi-mastodon",
}, },
{ {
network: 'GitHub', network: "GitHub",
url: 'https://github.com/aliarghyani', url: "https://github.com/mmahdium",
icon: 'i-mdi-github', icon: "i-mdi-github",
}, },
{ {
network: 'Portfolio', network: "Portfolio",
url: 'https://aliarghyani.vercel.app', url: "https://mahdium.ir",
icon: 'i-mdi-web', icon: "i-mdi-web",
}, },
], ],
summary: summary:
'Frontend Developer with **3+ years** building high-performance Vue.js/Nuxt applications for international clients. **AI-first engineer** leveraging AI-powered tools & methodologies to accelerate development by up to **2x** while maintaining code quality. Specialized in performance optimization, scalable architecture (SSR, PWA, RBAC), and accessibility. Delivered **8 production applications** with focus on maintainability and distributed team collaboration. Fluent in English (**8+ years** in fully English-speaking environment at Huawei).', "My background is primarily in backend development and system administration, where I've always enjoyed working with infrastructure, servers, and the logic that powers applications. More recently, I've begun learning Nuxt and Vue, expanding into frontend development to round out my skill set. While my main focus remains backend and system administration, I now also build user interfaces with Nuxt 4 and Vue 3, enabling me to deliver complete, end‑to‑end solutions.",
}, },
work: [ work: [
{ {
company: 'NexaPortal', company: "Group7Sky",
position: 'Frontend Developer (Remote)', position: "System Administrator & DevOps manager",
location: 'Izmir, Turkey', location: "Kerman, Iran",
startDate: '2024-12', startDate: "2024-6",
highlights: [ highlights: [
'Developed **5 interconnected applications** for two medical tourism platforms (**Elara Medical** & **Artemis Clinics**): admin panels, patient dashboards, and website with **10+ language** support and PWA capabilities', "Managed and maintained Linux-based servers, ensuring stable deployment environments, uptime monitoring, and routine performance optimization for production systems",
'Built custom **PDF template editor** with drag-and-drop interface, dynamic variable injection, and multi-page support, enabling non-technical staff to create patient documents without developer intervention', "Implemented CI/CD workflows and automated deployment pipelines using GitHub Actions and Docker, reducing manual deployment overhead and improving reliability",
'Engineered enterprise-grade **RBAC system** with deep permission patterns supporting field-level granularity and wildcard permissions across **40+ domain models**', "Configured and secured web services, reverse proxies, and SSL certificates, improving system stability and user trust across multiple client-facing applications",
'Developed **dynamic form builder** with **10+ field types** and drag-and-drop arrangement, reducing new form development time by **60%** through schema-based architecture', "Developed internal tools and utilities in Go, .NET, and TypeScript to streamline workflows and automate repetitive operational tasks",
'Implemented real-time messaging via **Pusher WebSockets** supporting WhatsApp and in-app channels, plus custom **Canvas animations** with physics simulation for premium UX', "Collaborated with development teams to diagnose infrastructure issues, optimize resource usage, and improve overall system performance",
'Optimized performance through code splitting, lazy loading, and Pinia state management; accelerated development by **2x** using AI-powered tools with **zero critical bugs**', "Provided technical support for OSS operations, including repository management, version control workflows, and issue triaging",
],
},
{
company: 'Freelance',
position: 'Frontend Developer (Remote)',
location: 'Tehran, Iran',
startDate: '2023-09',
endDate: '2024-12',
highlights: [
'Delivered **3 production-grade** web applications for international clients using Vue.js/Nuxt.js, consistently achieving strong performance metrics and high client satisfaction',
'Leveraged AI development tools to reduce development time by **40%** across all projects, enabling faster client delivery and **100% on-time** project completion rate',
'**Ideh** - Idea evaluation platform with reusable component library reducing development time by **30%** and scalable Vue.js architecture',
'**Insho** - Advertising marketplace with advanced dynamic form handling (schema-based architecture), modern backend-frontend structure reducing integration time by 40%, and responsive UI for creator-brand matching',
'**BaMashin** - Mobility rental platform with payment integration and responsive UI optimized for mobile/desktop',
'Led client communications, translated business requirements into technical specifications, delivered iteratively with clear documentation and transparent progress updates',
],
},
{
company: 'Huawei Technologies',
position: 'Senior Performance Team Lead',
location: 'Tehran, Iran',
startDate: '2022-04',
endDate: '2023-08',
highlights: [
'Led team managing performance and availability for **14,500+ network sites** nationwide, ensuring **99.5%+ uptime** and rapid incident response across distributed infrastructure',
'Automated Excel reporting workflows using **Python** and **Pandas**, reducing manual report generation time by **70%** and enabling real-time performance insights across **14,500+ sites**',
'Established operational standards and best practices; mentored **10 team members** improving team efficiency by **30%** through process optimization and knowledge sharing',
'Conducted comprehensive data analysis and KPI monitoring using advanced analytics; identified performance trends and improvement opportunities, reducing network downtime by **22%** year-over-year',
'Owned stakeholder communication interface; delivered weekly performance reports and monthly strategic updates to **C-level executives**, translating technical metrics into business impact',
'Built strong operational discipline (documentation, monitoring, incident management, quality gates) that directly enhances frontend engineering quality and architectural decision-making',
],
},
{
company: 'Huawei Technologies',
position: 'Technical & Leadership Roles',
location: 'Tehran, Iran',
startDate: '2016-06',
endDate: '2022-04',
highlights: [
'**Senior Performance Analyst** (2018-2022): Drove network KPI analysis across 2G/3G/LTE; contributed to audits, process improvements and performance dashboards',
'**Assistant Regional Manager** (2018): Managed **~3,000** BTS sites across Tehran Province; coordinated subcontractors and translated technical specs into implementation plans',
'**TCHA Team Lead** (2017-2018): Built availability dashboards and drove stakeholder alignment; recognized as **outstanding fresh graduate** at Huawei annual meeting',
'**Back Office Operations** (2016-2017): Supported OSS operations, performance checks and reporting; contributed to team efficiency and customer satisfaction',
], ],
}, },
], ],
education: [ education: [
{ {
institution: 'Qom University of Technology', institution: "Farhangian University of Kerman",
area: 'Telecommunications Engineering', area: "English Language Teaching",
studyType: 'Bachelor of Science', studyType: "Bachelor’s Degree",
startDate: '2010-09', startDate: "2025",
endDate: '2015-06', endDate: "ongoing",
courses: [ courses: [
'Software Architecture', "Academic Writing & Communication",
'Systems Design', "Educational Technology",
'Network Management', "Linguistics & Language Structure",
'Digital Signal Processing', "Research Methodology",
], ],
}, },
], ],
skills: [ skills: [
{ {
name: 'Frontend Core', name: "Frontend Core",
keywords: [ keywords: [
'Vue.js', "Vue.js",
'Nuxt.js', "Nuxt.js",
'TypeScript', "TypeScript",
'JavaScript (ES6+)', "JavaScript (ES6+)",
'HTML5', "Tailwind CSS",
'CSS3', "Pinia",
'Pinia', "DaisyUI",
'Vuetify', "Axios",
'Tailwind CSS', "vue-i18n",
], ],
}, },
{ {
name: 'AI-Assisted Development', name: "Backend & Systems",
keywords: [ keywords: [
'Cursor AI', "Go",
'GitHub Copilot', "Gin",
'Codex', ".NET",
'BMad Method', "PostgreSQL",
'Claude/ChatGPT', "MariaDB",
'Prompt Engineering', "Supabase",
'AI-Powered Code Review', "REST APIs",
"WebSocket",
], ],
}, },
{ {
name: 'Architecture & Performance', name: "DevOps & Infrastructure",
keywords: [ keywords: [
'SSR (Server-Side Rendering)', "Docker",
'SSG (Static Site Generation)', "GitHub Actions (CI/CD)",
'PWA (Progressive Web Apps)', "Linux",
'RBAC Systems', "Ubuntu",
'Code Splitting & Lazy Loading', "Nginx",
'Performance Optimization', "Cloudflare",
"Vercel",
"Appwrite",
], ],
}, },
{ {
name: 'Development Tools & Workflow', name: "AI‑Assisted Development",
keywords: [ keywords: [
'Git/GitHub', "Cursor",
'GitHub Actions (CI/CD)', "GitHub Copilot",
'ESLint/Prettier', "Prompt Engineering",
'Vite', "AI‑Powered Code Review",
'VueUse',
'REST APIs',
'WebSocket',
'Agile/Scrum',
], ],
}, },
{ {
name: 'Quality & Accessibility', name: "Architecture & Performance",
keywords: [ keywords: [
'WCAG 2.1 Compliance', "SSR (Server‑Side Rendering)",
'Lighthouse Optimization', "SSG (Static Site Generation)",
'Cypress E2E Testing', "Code Splitting & Lazy Loading",
'Code Review', "Caching Strategies",
'i18n Internationalization', "Performance Optimization",
'Responsive Design', ],
},
{
name: "Development Tools & Workflow",
keywords: [
"Git",
"GitHub",
"GitLab",
"pnpm",
"Swagger",
"ESLint/Prettier",
"Vite",
"VueUse",
"Agile/Scrum",
],
},
{
name: "Quality & UI/UX",
keywords: [
"Responsive Design",
"Accessibility Awareness",
"Lighthouse Optimization",
"Code Review",
"i18n Internationalization",
],
},
{
name: "Used Before",
keywords: [
"Python",
"C",
"C++",
"SQLite",
"MongoDB",
"Flask",
"Material UI",
"Arduino",
"Iconify",
], ],
}, },
], ],
languages: [ languages: [
{ {
language: 'Persian', language: "Persian",
fluency: 'Native', fluency: "Native",
}, },
{ {
language: 'English', language: "English",
fluency: 'Fluent', fluency: "Fluent",
}, },
], ],
certificates: [ // certificates: [
{ // {
name: 'Advanced English Proficiency', // name: "Advanced English Proficiency",
date: '2025', // date: "2025",
issuer: 'Duolingo English Test', // issuer: "Duolingo English Test",
url: '', // url: "",
summary: 'Score: 85/100 (Advanced Level)', // summary: "Score: 85/100 (Advanced Level)",
}, // },
], // ],
projects: [ projects: [
{ {
name: 'Ideh', name: "TBW (To Be Watched)",
description: description:
'Idea evaluation & market insights platform with scalable architecture and reusable component library', "A clean and minimal media tracking app for managing movies and series, built with Vue 3 and Tailwind CSS.",
highlights: [ highlights: [
'Component library reduced development time by 30%', "Designed a lightweight and responsive UI using Tailwind CSS and DaisyUI",
'Scalable Vue.js architecture', "Implemented local storage–based state management for fast, offline-friendly usage",
'Dynamic form generation system', "Integrated Axios for efficient API communication and modular data handling",
], ],
keywords: ['Vue.js', 'Nuxt.js', 'Component Library'], keywords: ["Vue.js", "TypeScript", "Tailwind CSS", "DaisyUI", "Axios"],
startDate: '2023-09', startDate: "2024-01",
endDate: '2024-12', endDate: "2024-03",
url: 'https://ideh.app', url: "https://tbw.monasef.ir/",
roles: ['Frontend Developer'], roles: ["Frontend Developer"],
type: 'application', type: "application",
}, },
{ {
name: 'Insho', name: "TorrentMax",
description: description:
'Media & advertising marketplace connecting agencies and creators for campaign collaboration', "A utility tool that enriches magnet links with additional trackers for improved torrent performance.",
highlights: [ highlights: [
'Advanced dynamic form handling with schema-based architecture enabling complex multi-functional forms with validation, conditional logic, and real-time updates', "Built a fast Nuxt-based interface with instant magnet parsing",
'Established modern structure between backend and frontend for seamless form data flow, reducing integration time by 40%', "Implemented tracker injection logic with clean, modular TypeScript",
'Responsive UI optimized for creator-brand matching with comprehensive listing and proposal management system', "Deployed globally on Vercel with optimized caching and edge performance",
], ],
keywords: ['Vue.js', 'Nuxt.js', 'Dynamic Forms', 'Schema-based Architecture', 'Marketplace'], keywords: ["Nuxt.js", "Vue.js", "TypeScript", "Tailwind CSS"],
startDate: '2023-09', startDate: "2024-02",
endDate: '2024-12', endDate: "2024-02",
url: 'https://insho.app', url: "https://torrentmax.monasef.ir/",
roles: ['Frontend Developer'], roles: ["Full‑stack Developer"],
type: 'application', type: "tool",
}, },
{ {
name: 'BaMashin', name: "HoolIt",
description: description:
'Mobility rental platform (cars, boats, helicopters) with comprehensive booking system and accessible UI', "An open-source alternative to dweet.io, enabling users to publish small code snippets and micro‑experiments.",
highlights: [ highlights: [
'Multi-category rental system', "Developed backend using Go and Gin with clean routing and modular structure",
'WCAG 2.1 compliant interface', "Containerized the application with Docker for consistent deployment",
'Payment integration', "Implemented secure API endpoints and efficient request handling",
], ],
keywords: ['Vue.js', 'TypeScript', 'Responsive Design', 'Accessibility'], keywords: ["Go", "Gin", "Docker", "REST API"],
startDate: '2023-09', startDate: "2024-04",
endDate: '2024-12', endDate: "2024-06",
url: 'https://bamashin.net', url: "https://github.com/mmahdium/HoolIt",
roles: ['Frontend Developer'], roles: ["Backend Developer"],
type: 'application', type: "application",
},
{
name: "PolyList",
description:
"A social music platform for creating, sharing, and tracking playlists with real-time listening history.",
highlights: [
"Built a scalable backend using Go, Gin, and PostgreSQL",
"Implemented Supabase authentication and real-time features",
"Developed a modern Nuxt 3 frontend with responsive UI and dynamic routing",
"Deployed on Vercel with optimized build and caching strategies",
],
keywords: [
"Go",
"Gin",
"PostgreSQL",
"Supabase",
"Nuxt.js",
"Vue.js",
"Tailwind CSS",
"Docker",
],
startDate: "2024-06",
endDate: "ongoing",
url: "https://pl.mahdium.ir",
roles: ["Full‑stack Developer"],
type: "application",
}, },
], ],
} };
+1 -1
View File
@@ -9,7 +9,7 @@
<AIStack /> <AIStack />
<SoftSkills /> <SoftSkills />
<LanguageSkills /> <LanguageSkills />
<GitHubActivity username="aliarghyani" /> <GitHubActivity username="mmahdium" />
<WorkExperience /> <WorkExperience />
<EducationList /> <EducationList />
<RecommendationsCarousel /> <RecommendationsCarousel />
+1 -1
View File
@@ -8,7 +8,7 @@ const route = useRoute()
const isPrintMode = computed(() => route.query.print === 'true') const isPrintMode = computed(() => route.query.print === 'true')
useHead({ useHead({
title: 'Resume - Ali Arghyani', title: 'Resume - Mohammad Mahdi Mohammadi',
meta: [ meta: [
{ name: 'robots', content: 'noindex' } { name: 'robots', content: 'noindex' }
] ]
+2 -2
View File
@@ -88,8 +88,8 @@ export default defineNuxtConfig({
runtimeConfig: { runtimeConfig: {
public: { public: {
loadPlausible: "", // overrided by env, loadPlausible: "", // overrided by env,
siteName: "AliArghyani", siteName: "Mohammad Mahdi Mohammadi",
siteUrl: "https://aliarghyani.vercel.app", // Used for sitemap and RSS generation siteUrl: "https://mahdium.ir", // Used for sitemap and RSS generation
githubToken: "", // GitHub API token - set via NUXT_PUBLIC_GITHUB_TOKEN env variable githubToken: "", // GitHub API token - set via NUXT_PUBLIC_GITHUB_TOKEN env variable
}, },
}, },
+5005 -7898
View File
File diff suppressed because it is too large Load Diff
+55 -51
View File
@@ -1,63 +1,65 @@
import puppeteer from 'puppeteer' import puppeteer from "puppeteer";
import type { Browser } from 'puppeteer' import type { Browser } from "puppeteer";
export default defineEventHandler(async (event) => { export default defineEventHandler(async (event) => {
let browser: Browser | null = null let browser: Browser | null = null;
try { try {
const requestUrl = getRequestURL(event) const requestUrl = getRequestURL(event);
const host = requestUrl.host.includes('192.168') || requestUrl.host.includes('localhost') const host =
? 'localhost:5000' requestUrl.host.includes("192.168") ||
: requestUrl.host requestUrl.host.includes("localhost")
const baseUrl = `http://${host}` ? "localhost:5000"
const resumeUrl = `${baseUrl}/resume?print=true` : requestUrl.host;
const baseUrl = `http://${host}`;
const resumeUrl = `${baseUrl}/resume?print=true`;
console.log('[PDF API] Generating from:', resumeUrl) console.log("[PDF API] Generating from:", resumeUrl);
const isDev = process.env.NODE_ENV === 'development' const isDev = process.env.NODE_ENV === "development";
if (isDev) { if (isDev) {
browser = await puppeteer.launch({ browser = await puppeteer.launch({
headless: true, headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox'], args: ["--no-sandbox", "--disable-setuid-sandbox"],
}) });
} else { } else {
const chromium = await import('@sparticuz/chromium') const chromium = await import("@sparticuz/chromium");
const puppeteerCore = await import('puppeteer-core') const puppeteerCore = await import("puppeteer-core");
browser = await puppeteerCore.default.launch({ browser = await puppeteerCore.default.launch({
args: chromium.default.args, args: chromium.default.args,
executablePath: await chromium.default.executablePath(), executablePath: await chromium.default.executablePath(),
headless: true, headless: true,
}) });
} }
const page = await browser.newPage() const page = await browser.newPage();
// Set viewport to A4 dimensions (210mm x 297mm at 96 DPI) // Set viewport to A4 dimensions (210mm x 297mm at 96 DPI)
await page.setViewport({ await page.setViewport({
width: 794, // 210mm width: 794, // 210mm
height: 1123 // 297mm height: 1123, // 297mm
}) });
// Enable print media type BEFORE loading page // Enable print media type BEFORE loading page
await page.emulateMediaType('print') await page.emulateMediaType("print");
const response = await page.goto(resumeUrl, { const response = await page.goto(resumeUrl, {
waitUntil: 'networkidle0', waitUntil: "networkidle0",
timeout: 30000, timeout: 30000,
}) });
if (!response || !response.ok()) { if (!response || !response.ok()) {
throw new Error(`Failed to load: ${response?.status()}`) throw new Error(`Failed to load: ${response?.status()}`);
} }
// Wait for Vue hydration and v-html rendering to complete // Wait for Vue hydration and v-html rendering to complete
await page.waitForSelector('strong', { timeout: 5000 }).catch(() => { await page.waitForSelector("strong", { timeout: 5000 }).catch(() => {
console.log('[PDF API] No strong tags found, continuing anyway') console.log("[PDF API] No strong tags found, continuing anyway");
}) });
// Additional wait to ensure all dynamic content is rendered // Additional wait to ensure all dynamic content is rendered
await new Promise(resolve => setTimeout(resolve, 1000)) await new Promise((resolve) => setTimeout(resolve, 1000));
// Inject critical CSS fixes for PDF generation - balanced spacing like web version // Inject critical CSS fixes for PDF generation - balanced spacing like web version
await page.addStyleTag({ await page.addStyleTag({
@@ -150,39 +152,41 @@ export default defineEventHandler(async (event) => {
line-height: 1.82 !important; line-height: 1.82 !important;
} }
`, `,
}) });
const pdf = await page.pdf({ const pdf = await page.pdf({
format: 'A4', format: "A4",
printBackground: true, printBackground: true,
margin: { top: 0, right: 0, bottom: 0, left: 0 }, margin: { top: 0, right: 0, bottom: 0, left: 0 },
preferCSSPageSize: true, preferCSSPageSize: true,
}) });
const query = getQuery(event) const query = getQuery(event);
const now = new Date() const now = new Date();
const year = now.getFullYear() const year = now.getFullYear();
const monthName = now.toLocaleString('en-US', { month: 'long' }) const monthName = now.toLocaleString("en-US", { month: "long" });
const filename = (query.filename as string) || `Ali_Arghyani_Resume_${monthName.replace(/\s+/g, '')}_${year}.pdf` const filename =
const download = query.download === 'true' (query.filename as string) ||
`Mohammad_Mahdi_Mohammadi_Resume_${monthName.replace(/\s+/g, "")}_${year}.pdf`;
const download = query.download === "true";
setResponseHeaders(event, { setResponseHeaders(event, {
'Content-Type': 'application/pdf', "Content-Type": "application/pdf",
// inline = show in browser, attachment = force download // inline = show in browser, attachment = force download
'Content-Disposition': `${download ? 'attachment' : 'inline'}; filename="${filename}"`, "Content-Disposition": `${download ? "attachment" : "inline"}; filename="${filename}"`,
}) });
return pdf return pdf;
} catch (error) { } catch (error) {
console.error('PDF generation failed:', error) console.error("PDF generation failed:", error);
setResponseStatus(event, 500) setResponseStatus(event, 500);
return { return {
error: 'PDF generation failed', error: "PDF generation failed",
message: error instanceof Error ? error.message : 'Unknown error', message: error instanceof Error ? error.message : "Unknown error",
} };
} finally { } finally {
if (browser) { if (browser) {
await browser.close() await browser.close();
} }
} }
}) });