Skip to content

Commit 98b76d1

Browse files
committed
Update project files
1 parent f01c0d0 commit 98b76d1

25 files changed

Lines changed: 2274 additions & 1088 deletions

.gitattributes

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
* text=auto eol=lf
2+
*.png binary
3+
*.jpg binary
4+
*.jpeg binary
5+
*.webp binary
6+
*.ico binary

.github/workflows/ci.yml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: ['**']
6+
pull_request:
7+
8+
permissions:
9+
contents: read
10+
11+
concurrency:
12+
group: ci-${{ github.workflow }}-${{ github.ref }}
13+
cancel-in-progress: true
14+
15+
env:
16+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
17+
18+
jobs:
19+
quality:
20+
runs-on: ubuntu-latest
21+
timeout-minutes: 15
22+
23+
steps:
24+
- name: Checkout
25+
uses: actions/checkout@v5
26+
27+
- name: Setup Node.js
28+
uses: actions/setup-node@v6
29+
with:
30+
node-version: '22'
31+
cache: npm
32+
registry-url: https://registry.npmjs.org
33+
34+
- name: Verify toolchain
35+
run: |
36+
node --version
37+
npm --version
38+
npm config get registry
39+
40+
- name: Install dependencies
41+
run: npm ci --no-audit --no-fund
42+
43+
- name: Lint
44+
run: npm run lint
45+
46+
- name: Check formatting
47+
run: npm run format:check
48+
49+
- name: Validate static site
50+
run: npm run validate:static
51+
52+
- name: Audit production dependencies
53+
run: npm run audit:prod

.npmrc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
registry=https://registry.npmjs.org/
2+
fund=false
3+
audit=false

.nvmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
22

404.html

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@
55
<meta content="width=device-width, initial-scale=1.0" name="viewport" />
66
<meta content="noindex,follow" name="robots" />
77
<meta content="#070A12" name="theme-color" />
8+
<meta content="strict-origin-when-cross-origin" name="referrer" />
9+
<meta
10+
http-equiv="Content-Security-Policy"
11+
content="default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; script-src 'self' 'sha256-OgUh3YouHqSqwluBZ8Bu4TCs9v/H1oay5zbavr85faE='; script-src-attr 'none'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; connect-src 'self'; manifest-src 'self'; form-action 'self'; upgrade-insecure-requests"
12+
/>
813
<script>
914
(() => {
1015
try {
@@ -22,24 +27,25 @@
2227
}
2328
})();
2429
</script>
25-
<link href="styles.css?v=20260202_8" rel="stylesheet" />
30+
<link href="styles.css?v=20260422_5" rel="stylesheet" />
2631
<title>Page Not Found — Tarek Masryo</title>
2732
</head>
2833
<body>
29-
<main class="section">
34+
<main class="section error-shell">
3035
<div class="container">
31-
<div class="card" style="max-width: 720px; margin: 0 auto; padding: 28px">
32-
<h1 style="margin: 0 0 10px; font-size: 34px">404</h1>
33-
<p style="margin: 0 0 18px; opacity: 0.9; line-height: 1.6">
34-
This page does not exist. The site is a single-page portfolio, so the best move is to go
35-
back home.
36+
<section class="card error-card" aria-labelledby="errorTitle">
37+
<p class="error-code">404</p>
38+
<h1 id="errorTitle">Page Not Found</h1>
39+
<p class="error-copy">
40+
This route does not exist. The portfolio is a single-page site, so the best path is to
41+
return home or jump to the main sections below.
3642
</p>
37-
<div class="cta" style="justify-content: flex-start">
43+
<div class="cta error-actions">
3844
<a class="btn primary" href="/">Back Home</a>
3945
<a class="btn" href="/#projects">Projects</a>
4046
<a class="btn" href="/#contact">Contact</a>
4147
</div>
42-
</div>
48+
</section>
4349
</div>
4450
</main>
4551
</body>

README.md

Lines changed: 119 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,164 @@
1-
# Tarek Masryo — Portfolio
1+
# Tarek Masryo — Portfolio Website
22

3-
Static portfolio website (HTML/CSS/JS) showcasing production-minded **ML** & **GenAI** projects and dashboards.
3+
Production-focused portfolio website for showcasing AI/ML systems, GenAI work, RAG projects, datasets, dashboards, and decision-ready engineering work.
44

5-
**Live:** https://tarekmasryo.github.io/
5+
**Live site:** https://tarekmasryo.github.io/
66

7-
---
7+
## Overview
88

9-
## Local run
9+
This repository powers the public portfolio of **Tarek Masryo**, an **AI/ML Engineer** focused on production-ready systems, evaluation-first workflows, dashboards, APIs, monitoring, and applied GenAI.
1010

11-
### Option A (recommended): Python
11+
The site is intentionally built as a **fast static website** using plain HTML, CSS, and JavaScript for simple maintenance, predictable deployment, and clean GitHub Pages hosting.
1212

13-
From the repo root:
13+
## What the site presents
1414

15-
```bash
16-
python -m http.server 8000
17-
```
15+
- professional positioning and hero section
16+
- curated portfolio projects across ML, GenAI, RAG, dashboards, datasets, and analytics
17+
- project filtering and search
18+
- project detail modal with problem framing, approach, signals, stack, and repository links
19+
- services, technical stack, working style, and contact sections
20+
- direct links to GitHub, LinkedIn, Kaggle, Hugging Face, Streamlit, and X
21+
22+
## Key characteristics
1823

19-
Open:
24+
- **Static-first architecture** — no framework lock-in and no unnecessary runtime complexity
25+
- **GitHub Pages friendly** — clean deployment as a user site
26+
- **Responsive layout** — designed for desktop and mobile viewing
27+
- **Portfolio-driven content model** — project metadata is maintained in `app.js`
28+
- **SEO foundations** — canonical tags, Open Graph metadata, Twitter cards, `robots.txt`, `sitemap.xml`, and JSON-LD structured data
29+
- **Custom 404 page** — branded fallback for invalid routes
30+
- **Web app manifest and icons included** — improved metadata and browser integration on supported platforms
2031

21-
- http://localhost:8000
32+
## Stack
2233

23-
### Option B: Node tooling (optional)
34+
- HTML5
35+
- CSS3
36+
- Vanilla JavaScript
37+
- GitHub Pages
38+
- Node-based quality checks for linting, formatting, and static validation
39+
40+
## Repository structure
41+
42+
```text
43+
.
44+
├── index.html # Main portfolio page
45+
├── 404.html # Custom not-found page
46+
├── styles.css # Site styling and responsive layout
47+
├── app.js # Project catalog and interactive UI behavior
48+
├── assets/ # Project covers, profile assets, icons, and brand images
49+
├── scripts/
50+
│ └── validate-static.mjs # Static integrity validation script
51+
├── site.webmanifest # Web app manifest
52+
├── robots.txt # Search engine crawl guidance
53+
├── sitemap.xml # Sitemap for indexing
54+
├── .nojekyll # Disable Jekyll processing on GitHub Pages
55+
└── .github/workflows/ci.yml # CI checks for pushes and pull requests
56+
```
2457

25-
Install dev tooling:
58+
## Local development
59+
60+
### Serve locally
2661

2762
```bash
28-
npm install
63+
python -m http.server 8000
64+
```
65+
66+
Then open:
67+
68+
```text
69+
http://localhost:8000
2970
```
3071

31-
Lint:
72+
### Install quality-check tooling
3273

3374
```bash
34-
npm run lint
75+
npm ci --no-audit --no-fund
3576
```
3677

37-
Format:
78+
## Available commands
3879

3980
```bash
81+
npm run start
82+
npm run serve
83+
npm run lint
4084
npm run format
85+
npm run format:check
86+
npm run validate:static
87+
npm run audit:prod
88+
npm run check
4189
```
4290

43-
Serve locally:
91+
## Quality workflow
92+
93+
`npm run check` runs the main local quality gate:
4494

4595
```bash
46-
npm run start
96+
npm run lint && npm run format:check && npm run validate:static && npm run audit:prod
4797
```
4898

49-
---
99+
The static validator checks important site integrity rules such as:
50100

51-
## Deploy (GitHub Pages)
101+
- required files exist
102+
- local asset references resolve correctly
103+
- internal anchor links point to valid section IDs
104+
- project entries remain consistent
105+
- repository and image mappings stay valid
106+
- critical metadata stays present
52107

53-
This repository is configured as a **User GitHub Pages site**:
108+
## Content update workflow
54109

55-
1. GitHub → **Settings****Pages**
56-
2. **Source:** Deploy from a branch
57-
3. **Branch:** `main`
58-
4. **Folder:** `/(root)`
110+
### Add or edit portfolio projects
59111

60-
The site is served at:
112+
Project catalog content is maintained in:
61113

62-
- https://tarekmasryo.github.io/
114+
```text
115+
app.js
116+
```
63117

64-
---
118+
Each project entry can define fields such as:
65119

66-
## Project files
120+
- category
121+
- type
122+
- title
123+
- description
124+
- problem framing
125+
- approach bullets
126+
- signals / outcomes
127+
- stack
128+
- tags
129+
- repository slug
130+
- image base name
67131

68-
- `index.html` — main page
69-
- `styles.css` — styling
70-
- `app.js` — client-side logic
71-
- `assets/` — images + icons (**must be committed**)
72-
- `site.webmanifest` — PWA metadata + app icons
73-
- `robots.txt` — crawler rules
74-
- `sitemap.xml` — sitemap for indexing
132+
### Update visuals
75133

76-
---
134+
Add or replace project covers and profile assets inside:
77135

78-
## Notes
136+
```text
137+
assets/
138+
```
139+
140+
### Update page copy or layout
141+
142+
- main markup: `index.html`
143+
- styling: `styles.css`
144+
- interactions and project rendering: `app.js`
79145

80-
- **GitHub Pages is case-sensitive**: `Image.png``image.png` (same for spaces and extensions).
81-
- Do **not** add `assets/` to `.gitignore` (otherwise images won’t load on Pages).
82-
- If you use ES modules (`import/export`) in `app.js`, update the script tag to:
146+
## Deployment
83147

84-
```html
85-
<script type="module" src="app.js"></script>
86-
```
148+
This repository is configured for **GitHub Pages** deployment as a **user site**.
87149

88-
- If updates don’t appear immediately, hard refresh (Ctrl+F5) or bump the `?v=` cache-buster in asset URLs.
89-
- Optional: add an empty `.nojekyll` file in the repo root to disable Jekyll processing.
150+
Expected settings:
151+
152+
1. **Source:** Deploy from a branch
153+
2. **Branch:** `main`
154+
3. **Folder:** `/(root)`
155+
156+
## Notes
90157

91-
---
158+
- GitHub Pages is case-sensitive for file paths
159+
- keep all required assets committed to avoid broken project cards and previews
160+
- this repository intentionally stays simple and does not require a frontend framework
92161

93162
## License
94163

95-
MIT — see `LICENSE`.
164+
This project is released under the **MIT License**. See `LICENSE` for details.

0 commit comments

Comments
 (0)