A fast, static portfolio website for Tarek Masryo, an AI/ML Engineer building practical machine learning and GenAI systems that connect data, models, software, and user-facing workflows into reliable products.
Live site: https://tarekmasryo.github.io/
This repository contains the source code for a public portfolio site built to present production-minded AI/ML and GenAI work clearly, quickly, and reliably.
The site intentionally uses plain HTML, CSS, and vanilla JavaScript. There is no frontend framework, no build pipeline requirement, and no backend dependency. The goal is a clean GitHub Pages deployment with predictable maintenance and strong static-site quality checks.
- Production-minded ML systems, dashboards, APIs, datasets, and GenAI workflows
- A searchable and filterable project catalog
- Project detail modals with summaries, approaches, signals, stacks, and links
- Public profile links for GitHub, LinkedIn, Kaggle, Hugging Face, Streamlit, X, Email, and CV
- Sections for services, technical stack, working style, FAQ, and contact
- SEO and social preview metadata for clean sharing across LinkedIn, X, WhatsApp, and other platforms
- Machine learning systems — risk scoring, classification, calibration, thresholds, and reproducible artifacts
- GenAI, RAG, and LLMOps — retrieval evaluation, telemetry, trace review, triage workflows, and drift signals
- APIs and serving — FastAPI, strict schemas, typed contracts, versioned artifacts, and model-serving workflows
- Decision apps and dashboards — operator-facing interfaces, KPIs, review queues, and workflow controls
- Datasets and evaluation assets — structured datasets, telemetry logs, benchmark-style data, and analysis-ready resources
- Static-first architecture for simple hosting and low operational overhead
- Separated project data in
projects.jsinstead of embedding all portfolio content inside the UI controller - Responsive UI for desktop and mobile screens
- Mobile rendering hardening that reduces heavy background and glass effects on narrow/coarse-pointer devices
- No-JavaScript fallback for featured project links
- Static security guardrails including CSP metadata, SRI on the external icon script, and safe external-link defaults
- Safe external links using
rel="noopener noreferrer" - SEO foundations including canonical URL, Open Graph, Twitter cards, JSON-LD,
robots.txt, andsitemap.xml - Custom validation scripts for static integrity and security guardrails
- Playwright smoke tests for core browser interactions
- GitHub Actions CI for repeatable checks on pushes and pull requests
- HTML5
- CSS3
- Vanilla JavaScript
- GitHub Pages
- Node.js tooling
- Playwright
.
├── index.html # Main portfolio page
├── 404.html # Custom not-found page
├── styles.css # Site styling and responsive layout
├── projects.js # Structured project catalog data
├── app.js # Interactive UI behavior and app orchestration
├── assets/ # Project covers, profile assets, icons, and brand images
├── scripts/
│ ├── validate-static.mjs # Static integrity validation
│ └── security-audit.mjs # Static security guardrail checks
├── tests/e2e/ # Playwright browser smoke tests
├── site.webmanifest # Web app manifest
├── robots.txt # Search engine crawl guidance
├── sitemap.xml # Sitemap for indexing
├── .nojekyll # Disable Jekyll processing on GitHub Pages
└── .github/workflows/ci.yml # CI checks for pushes and pull requests
Install dependencies:
npm ci --no-audit --no-fundStart the local server:
npm run startOpen:
http://localhost:8000
npm run serve is available as an alias for local serving.
Run the main static quality gate:
npm run checkThis runs linting, formatting checks, static validation, security audit, and production dependency audit.
Run browser smoke tests:
npx playwright install chromium
npm run test:e2eRun the full local gate:
npm run check:fullnpm run start # Serve the static site locally
npm run serve # Alias for local serving
npm run lint # Run ESLint
npm run format # Format files with Prettier
npm run format:check # Check formatting without writing changes
npm run validate:static # Validate static site integrity
npm run security:audit # Run static security guardrails
npm run audit:prod # Audit production dependencies
npm run test:e2e # Run Playwright smoke tests
npm run check # Main static quality gate
npm run check:full # Static quality gate + Playwright smoke testsThe validation scripts check:
- Required files and metadata
- Local asset references
- Internal anchor targets
- Project data consistency
- Project image mappings
- CSP and inline script hash integrity
- Iconify CDN SRI and
crossoriginsettings - External profile, CV, and third-party runtime link guardrails
- Mobile visual-effect fallback guardrails
- No-JavaScript featured project fallback
- Safe external link attributes
- Common secret-like patterns
- Dangerous dynamic execution sinks
The Playwright smoke tests cover:
- Initial page load
- Project rendering
- Search and clear search behavior
- Project modal open and close flow
- Theme toggle behavior
- Mobile navigation open and close flow
- Mobile visual-effect fallback behavior
- No-JavaScript featured project fallback
- Local asset request failures
Portfolio project data is maintained in:
projects.js
Each project entry can include:
- category
- type
- title
- description
- problem or summary framing
- approach bullets
- signals or outcomes
- stack
- tags
- repository slug
- optional external URL
- optional secondary link
- image base name
Project covers and visual assets live in:
assets/
Project covers should include WebP versions because the static validator checks project image availability.
This repository is configured for GitHub Pages as a user site.
Expected GitHub Pages settings:
- Source: Deploy from a branch
- Branch:
main - Folder:
/(root)
Before pushing a release:
npm ci --no-audit --no-fund
npm run check
npx playwright install chromium
npm run test:e2eAfter deployment, verify the live site visually and refresh social previews if needed through the relevant platform preview tools.
Before publishing, confirm:
- The project opens locally at
http://localhost:8000 npm run checkpassesnpm run test:e2epasses- No local output folders are committed
- Project images and profile icons load correctly
- Search, filters, modals, theme toggle, and mobile navigation work
- The CV link opens without access requests
Do not commit local dependency or test output folders:
node_modules/
playwright-report/
test-results/
- GitHub Pages file paths are case-sensitive.
- Keep required assets committed to avoid broken project cards and previews.
- The site intentionally avoids a frontend framework to keep deployment and maintenance simple.
- The public CV link is managed externally and should remain viewable without access requests.
The source code in this repository is released under the MIT License. See LICENSE for details.
Portfolio content, branding, personal information, images, and project descriptions remain the property of Tarek Masryo unless otherwise stated.