{"id":49182574,"url":"https://github.com/oelhwry/portfolio","last_synced_at":"2026-04-23T02:03:49.193Z","repository":{"id":318972256,"uuid":"1075434118","full_name":"OElhwry/Portfolio","owner":"OElhwry","description":"A personal portfolio featuring full-stack apps, interactive experiences, and polished UI projects.","archived":false,"fork":false,"pushed_at":"2026-04-15T22:50:04.000Z","size":21140,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-16T00:29:21.024Z","etag":null,"topics":["animations","developer-portfolio","framer-motion","frontend","github-pages","interactive-ui","modern-web","nextjs","personal-website","portfolio","projects","showcase","static-site","tailwindcss","typescript","web-development"],"latest_commit_sha":null,"homepage":"https://oelhawary.com/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OElhwry.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-13T13:50:08.000Z","updated_at":"2026-04-15T22:48:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"8cd52135-3fc3-44c8-a20d-4499b45934dc","html_url":"https://github.com/OElhwry/Portfolio","commit_stats":null,"previous_names":["oelhwry/portfolio"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/OElhwry/Portfolio","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OElhwry%2FPortfolio","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OElhwry%2FPortfolio/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OElhwry%2FPortfolio/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OElhwry%2FPortfolio/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OElhwry","download_url":"https://codeload.github.com/OElhwry/Portfolio/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OElhwry%2FPortfolio/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32162614,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-22T17:06:48.269Z","status":"online","status_checked_at":"2026-04-23T02:00:06.710Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["animations","developer-portfolio","framer-motion","frontend","github-pages","interactive-ui","modern-web","nextjs","personal-website","portfolio","projects","showcase","static-site","tailwindcss","typescript","web-development"],"created_at":"2026-04-23T02:03:41.234Z","updated_at":"2026-04-23T02:03:49.182Z","avatar_url":"https://github.com/OElhwry.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Omar El Hawary — Portfolio\n\nPersonal portfolio site, live at **[oelhawary.com](https://oelhawary.com)**.\n\nBuilt as a proper project in its own right: statically exported Next.js 15 app deployed to GitHub Pages via a custom domain, with full TypeScript, animated interactions, and a per-project page for each piece of work.\n\n---\n\n## Pages\n\n### Home (`/`)\nSplit-panel layout with a sticky left panel (name, title, availability pills, section nav, social links, CV download) and a scrollable right panel.\n\n- **About** — background, what I build, what I'm looking for\n- **Experience** — PWR Events (Box Office) and NHS Test \u0026 Trace (Call Handler)\n- **Projects** — cards linking to each individual project page\n\n### Project pages\n\n| Route | Project |\n|---|---|\n| `/peerfitv2` | PeerFit v2 — full-stack social sports platform, live at peerfit.co.uk |\n| `/peerfitv1` | PeerFit v1 — original PHP / MySQL prototype, the origin of the idea |\n| `/deadcenter` | Deadcenter — browser precision-timing game with 20 levels |\n| `/kvit` | Kvit — offline bill splitter, calculates minimum transfer set |\n| `/aphelion` | Aphelion — interactive space visualisation with NASA APIs |\n\nEach project page follows the same split layout: sticky left panel with tech stack, section nav, and CTAs; right panel with About, Screenshots (direction-aware slideshow), and a closing section (design notes, lessons, etc.).\n\n### 404 (`/not-found.tsx`)\nCustom not-found page matching the home page aesthetic — indigo aurora, dot field, links back to the portfolio and projects.\n\n---\n\n## Tech Stack\n\n| Layer | Choice |\n|---|---|\n| Framework | Next.js 15 (App Router, static export) |\n| Language | TypeScript 5 |\n| Styling | Tailwind CSS 4 |\n| Animation | Framer Motion 12 |\n| Fonts | Geist Sans + Geist Mono (next/font) |\n| Images | `next/image` with `unoptimized: true` (required for static export) |\n| Deployment | GitHub Pages via `gh-pages`, custom domain via CNAME |\n\n---\n\n## Folder structure\n\n```\nmy-portfolio/\n├── app/\n│   ├── layout.tsx              # Root layout — metadata, fonts, OG tags\n│   ├── globals.css             # Base styles, focus rings, reduced-motion rule\n│   ├── not-found.tsx           # Custom 404 page\n│   ├── (site)/\n│   │   └── page.tsx            # Home page\n│   └── (projects)/\n│       ├── peerfitv2/page.tsx\n│       ├── peerfitv1/page.tsx\n│       ├── deadcenter/page.tsx\n│       ├── kvit/page.tsx\n│       └── aphelion/page.tsx\n├── lib/\n│   └── project-media.ts        # Centralised image imports + screenshot arrays\n├── public/\n│   ├── images/projects/        # All project screenshots, organised per project\n│   │   ├── peerfit-v1/\n│   │   ├── peerfit-v2/\n│   │   ├── deadcenter/\n│   │   ├── Kvit/\n│   │   └── Aphelion/\n│   ├── omar-elhawary-cv-software.pdf   # CV — linked from the download icon in the header\n│   └── CNAME                   # Custom domain for GitHub Pages\n├── next.config.ts              # output: \"export\", trailingSlash, unoptimized images\n└── package.json\n```\n\n---\n\n## Local setup\n\n```bash\n# Clone the repo\ngit clone https://github.com/OElhwry/Portfolio.git\ncd Portfolio/my-portfolio\n\n# Install dependencies\nnpm install\n\n# Start the dev server (http://localhost:3000)\nnpm run dev\n```\n\nRequires Node 18+.\n\n---\n\n## Build and deploy\n\n```bash\n# Static export to my-portfolio/out/\nnpm run build\n\n# Build + push to GitHub Pages (sets CNAME to oelhawary.com)\nnpm run deploy\n```\n\n`npm run deploy` runs `next build` followed by `gh-pages -d out --nojekyll --cname oelhawary.com`. The `--nojekyll` flag is required so GitHub Pages serves the Next.js static export correctly without stripping underscore-prefixed files.\n\nThe `output: \"export\"` setting in `next.config.ts` means this is a fully static site — no server, no edge functions. All pages are pre-rendered at build time to `out/`.\n\n---\n\n## Supporting assets\n\n| Asset | Location |\n|---|---|\n| CV (PDF) | `my-portfolio/public/omar-elhawary-cv-software.pdf` |\n| Project screenshots | `my-portfolio/public/images/projects/\u003cproject\u003e/` |\n| Image imports + screenshot metadata | `my-portfolio/lib/project-media.ts` |\n\nTo update the CV, replace the file in `public/` and keep the same filename, or update the `href` on the download button in `app/(site)/page.tsx` (search for `omar-elhawary-cv-software.pdf`).\n\n---\n\n## Accessibility\n\n- `:focus-visible` rings on all interactive elements (defined globally in `globals.css`)\n- `prefers-reduced-motion` media query disables decorative animation site-wide\n- Cursor glow and mouse-tracking effects skip touch devices and reduced-motion users at the JS level\n- `aria-label` attributes on all icon-only buttons and nav landmarks\n\n---\n\n## Contact\n\n**omar.elhawary@hotmail.co.uk** · [oelhawary.com](https://oelhawary.com) · [linkedin.com/in/oelhawary](https://linkedin.com/in/oelhawary)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foelhwry%2Fportfolio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foelhwry%2Fportfolio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foelhwry%2Fportfolio/lists"}