This repository contains Dr. Chia Min Yan's personal portfolio website and automated curriculum vitae (CV) generation system.
Built using Angular 22+ with modern SCSS styling, featuring a clean developer layout, a responsive canvas particle backdrop, multilingual localization support, and selected publications.
- Main Portfolio (
/): Hosts the primary developer profile (PortfolioComponent) showcasing interactive capability tabs, career experience, academic publications, and contact forms. - Interactive CV (
/cv): A web-based counterpart (CvComponent) of the professional CV, specifically formatted via print stylesheets to render and print exactly onto a 2-page A4 layout.
- Supported languages: English (
en), Chinese (zh), and Malay (ms). - Language files are located at public/i18n/ (
en.json,zh.json,ms.json). These are served dynamically by TranslationService. - English acts as the initial in-memory fallback to ensure seamless rendering without layout shift.
Run npm run start to start the local development server at http://localhost:4200/.
- Build Production: Run
npm run buildto compile the app. Production assets are output to thedocs/directory for deployment compatibility (e.g., GitHub Pages). - GitHub Pages Build: Run
npm run build:github-pagesto compile production assets with a base href of/profile/.
- Linting: Run
npm run lintto execute ESLint and Prettier checks on code templates, SCSS styles, and language JSON files. - Formatting: Run
npm run formatto execute Prettier code and JSON formatter. - Unit Tests: Run
npm run testto run Vitest unit tests.
Located in the cv-generator/ directory, this Python script uses ReportLab to compile a professional, grid-aligned, 2-page CV PDF with clean Inter typography.
cv-generator/generate_cv.py— The core ReportLab compiler script.cv-generator/inter-v20-latin-*— Extracted TrueType font files for the premium "Inter" typography.public/profile_cv.jpg— The profile photo used strictly on the CV (blue background, tie).public/profile.jpg— The original profile photo used strictly on the website.
To regenerate the CV PDF:
python cv-generator/generate_cv.pyThis automatically compiles the document, saves the primary bundle to public/CV.pdf (served by the Angular app), and creates a synchronized copy at the workspace root CV.pdf.
The CV has a strict 2-page budget. You can programmatically verify the page count using:
python -c "import pypdf; reader = pypdf.PdfReader('CV.pdf'); print(len(reader.pages))"
# Output should be exactly 2