Static, production-ready portfolio website for kamranboroomand.ir, with multilingual UX, data-driven projects, case-study pages, and CI quality gates.
This repo can be used as-is for this site or forked as a base for your own portfolio website.
- Main site:
https://kamranboroomand.ir/ - Case studies:
https://kamranboroomand.ir/projects/nullid/https://kamranboroomand.ir/projects/nullcal/https://kamranboroomand.ir/projects/pacman/https://kamranboroomand.ir/projects/nullkeys/https://kamranboroomand.ir/projects/saadi-institute/
- Single-page tab flow with hash routing (
#about,#resume,#portfolio,#settings). - Language switcher with persisted preference (
en,ru,fa) and RTL support for Persian. - Data-driven project cards from
assets/data/projects.json. - Dedicated case-study pages under
projects/*with project-specific SEO/OG metadata. - Optional interactive effects layer (React + OGL) mounted separately from core content.
- Accessibility baseline with keyboard tab navigation, skip link, and
axechecks. - SEO and discoverability: Open Graph, Twitter metadata, JSON-LD schema,
robots.txt, andsitemap.xml. - Security baseline: static-host-compatible CSP metadata, hardened outbound links, security disclosure files, and documented CDN/header TODOs.
- Privacy baseline: no Google Analytics, GTM, advertising tags, remote tracking pixels, or third-party analytics scripts; see
docs/privacy-analytics.md. - Automated quality gates in CI, including Playwright, Lighthouse CI, and asset budgets.
- UI:
HTML,CSS,Vanilla JavaScript - Effects layer:
React 18,OGL, bundled byesbuild - Tooling:
ESLint,Prettier - Tests:
Playwright,@axe-core/playwright,Lighthouse CI - Asset pipeline:
sharpscripts for image optimization and responsive variants
.
├── index.html
├── 404.html
├── projects/
├── security/
├── assets/
│ ├── css/
│ ├── data/
│ ├── docs/
│ ├── images/
│ └── js/
├── src/react/
├── scripts/
├── tests/e2e/
├── .well-known/security.txt
├── docs/deployment-security-todo.md
├── docs/deployment-security-headers.md
├── docs/live-site-verification.md
├── docs/privacy-analytics.md
├── docs/seo-roadmap.md
├── docs/subdomain-inventory.md
├── SECURITY.md
├── .github/workflows/
└── README.md
Prerequisites:
- Node.js
24recommended to match CI; Node.js20.19+may work, but CI runs Node 24 - npm
10+
Install:
npm ciRun local development (watch effects bundle + static server):
npm run devOpen http://127.0.0.1:4173.
Development and build:
npm run dev- watch effects bundle and serve on127.0.0.1:4173npm run serve- static server for manual checksnpm run serve:test- static server used by Playwright (127.0.0.1:4273)npm run watch:effects- rebuildassets/js/effects.bundle.json changenpm run build:effects- one-time effects bundle buildnpm run build- run the normal effects build without regenerating imagesnpm run build:with-images- refresh responsive image variants, then run the effects buildnpm run images:responsive- refresh responsive image variants that are missing or stalenpm run images:responsive:force- force responsive image regenerationnpm run optimize:images- optimize source image assetsnpm run resume:pdf- regenerateassets/docs/kamran-boroomand-resume-ats.pdf
Quality and release gates:
npm run lint- ESLint across browser JS, scripts, and testsnpm run format- Prettier write modenpm run format:check- Prettier check modenpm run perf:check- asset/performance budget checksnpm run test:hygiene- fail on local artifacts, private env/key files, and dirty release exportsnpm run test:assets- verify local asset references, responsive images, and image file validitynpm run test:security- static CSP/privacy/trust/deployment posture checksnpm run test:seo- metadata, hreflang, sitemap, robots, JSON-LD, and placeholder checksnpm run test:links- internal link/asset reference checks in HTMLnpm run test:e2e- Chromium smoke suitenpm run test:e2e:matrix- smoke suite across multiple browsers/devicesnpm run test:a11y- accessibility checks withaxenpm run test:visual- visual regression snapshotsnpm run test:e2e:easter-egg- avatar easter egg behavior checknpm run test:lighthouse- Lighthouse CI assertions with automatic retry on transient Chrome interstitial failuresnpm run verify:live- public live-site verification for deployment correctness, headers, and public filesnpm run check- build + lint + format + perf + hygiene + assets + security + SEO + links + smoke + a11ynpm run quality:extended- matrix + visual + easter eggnpm run release:prepare- full gate (check + quality:extended + lighthouse)npm run release:zip- create a clean public ZIP inoutput/after hygiene checks
When visual baselines intentionally change:
npm run test:visual -- --update-snapshotsLighthouse retry tuning (optional):
LHCI_MAX_ATTEMPTS- number of autorun attempts before failing (default3)LHCI_RETRY_DELAY_MS- delay between retries in milliseconds (default3000)
If you fork this project, update these first:
- Identity and metadata
index.html:<title>, description, canonical URL, Open Graph, Twitter, JSON-LD person/site data404.html: fallback copy and metadata
- Personal and project content
assets/data/projects.json: card content, filters, metrics, links, localized project textprojects/*/index.html: case-study page copy and mediaassets/data/translations.json: interface and content localization
- Resume
assets/docs/kamran-boroomand-resume-ats.htmlthen runnpm run resume:pdf
- Domain and indexing
CNAME,robots.txt,sitemap.xml, and absolute URLs in HTML metadata
- Branding/media
- Replace images under
assets/images/, then run:npm run optimize:imagesnpm run images:responsivenpm run build:with-images
Normal npm run build only rebuilds the static effects bundle. Use npm run build:with-images
after changing source images or responsive image settings.
Workflows in .github/workflows/:
ci.yml- main CI for build, lint, formatting, perf, links, smoke, a11y, and lighthouse jobsextended-quality.yml- scheduled/manual cross-browser smoke + visual regressionpreview.yml- PR preview artifact upload with PR commentrelease-snapshot.yml- artifact snapshot for pushes tomainrollback.yml- manual rollback PR generator to a target commit SHAuptime-monitor.yml- Live Site Verification workflow for deployment correctness, headers, public files, report artifacts, and alert issue flow
Lighthouse thresholds (.lighthouserc.json):
- Performance:
>= 0.53 - Accessibility:
>= 0.95 - SEO:
>= 0.90
This is a static site. You can deploy to any static host (for example GitHub Pages, Cloudflare Pages, Netlify, Vercel static output, or S3+CDN).
The checked-in CNAME makes the repo GitHub Pages-compatible, but arbitrary HTTP response headers are not controlled by this repo when served directly from GitHub Pages. See docs/deployment-security-headers.md, docs/deployment-security-todo.md, and docs/live-site-verification.md for CDN/host-level headers, DNS, registrar, monitoring, and runtime verification tasks.
Recommended release flow:
- Update content/code/assets.
- Run
npm run release:prepare. - Optionally run
npm run release:zipfor a clean public export. - Commit source and intended generated assets only.
- Push and deploy.
See CONTRIBUTING.md for branch and release checklists.
Released under the MIT License. See LICENSE.