Ongoing / ongoing

This portfolio: design & engineering

A portfolio should make the work easy to understand, then give you a reason to explore. This site combines clear project stories, actual product captures, explanatory interactions, and technical SEO. It also keeps a public record of earlier audit findings and how to check them again.

  • Project evidence first
  • Keyboard-accessible interactions
  • Published audit methodology
My role
Design, development & SEO
Selected stack
Next.js · TypeScript · Tailwind v4 · Vercel
01 / Context

Clarity comes before the visual effect

The redesign starts with the visitor's questions: who is this, what can they build, what have they delivered, and how do I start a conversation? Project names, responsibilities, and evidence need to answer those before an animation plays.

An earlier technical audit also found issues outside the visual design: incorrect canonical URLs, blocked crawler resources, a text contrast problem, and an unrealistic JavaScript budget.

02 / Decisions

Show the product and explain the decisions

The current direction uses warm reading surfaces, clear typography, and real website and app captures. Private systems are explained through labeled diagrams. Conceptual artwork supports the story without pretending to be a product screenshot.

The visual layer pairs generated stills with one six-second Higgsfield animation of the operations scene. The clip is served locally in desktop and mobile versions, with playback controls and a still-image fallback. HTML diagrams and ordinary links carry the explanation, so the work remains understandable without playback.

Each page has its own canonical and social metadata. Historical measurements stay dated, while the reproducible commands below make the current implementation available for inspection.

03 / Delivery

A site with inspectable decisions

The July 2026 audit corrected the sampled canonical URLs, removed the recorded crawl blockers, and improved the measured text-color pair. The table below preserves those historical results.

The current design is assessed on its own terms: readable content, working navigation, usable interactions, and measured delivery. Historical asset sizes or color scores are not presented as results for a new release.

The evidence / Historical audit

What the earlier audit changed.

Baseline recorded 2026-07-19. These are the published results from that audit, not fresh measurements of this redesign. The eight-page sample belongs to that point in time.

Historical before and after results from the July 2026 audit.
CheckBeforeAfter
Pages with correct canonicalsevery non-home page declared the homepage as its canonical1 / 88 / 8
Crawl blockers in robots.txtCSS/JS and the OG image route were blocked from Googlebot20
Lowest text contrast (WCAG)one token used ~71 times failed AA3.28:16.18:1

Recorded in the original baseline, published audit data, and measured color pairs.

01 / Canonicals, crawl rules, and host redirects

Read each URL in the current sitemap and compare its canonical with that URL. Inspect robots.txt for rules blocking CSS, JavaScript, or the social image route. Check the apex response for its redirect status and Location header. A canonical is a signal to search engines; this check does not prove indexing or rankings.

# Check every currently published route, rather than a fixed historical set.
python3 - <<'PY'
from urllib.request import urlopen
from html.parser import HTMLParser
import xml.etree.ElementTree as ET

class Canonical(HTMLParser):
    def handle_starttag(self, tag, attrs):
        attrs = dict(attrs)
        if tag == 'link' and attrs.get('rel') == 'canonical':
            print('  canonical:', attrs.get('href'))

root = ET.fromstring(urlopen('https://www.yasser-shkeir.com/sitemap.xml').read())
for item in root.findall('.//{*}loc'):
    print(item.text)
    Canonical().feed(urlopen(item.text).read().decode())
PY

# Inspect crawl rules and the preferred-host redirect.
curl -fsS https://www.yasser-shkeir.com/robots.txt
curl -sI https://yasser-shkeir.com/
02 / First-load JavaScript

Build the same checkout with the same Node version and lockfile, then total the gzip size of unique JavaScript chunks referenced by the homepage HTML. Use the same compression settings for before and after. The project budget is 260 KB gzip. Asset size is one delivery measurement; it does not measure the visitor's interaction or loading experience.

npm ci
npm run build
node --input-type=module <<'JS'
import { readFileSync } from 'node:fs';
import { gzipSync } from 'node:zlib';
const html = readFileSync('.next/server/app/index.html', 'utf8');
const chunks = [...new Set(html.match(/\/_next\/static\/[^"\s<>]+\.js/g) ?? [])];
if (!chunks.length) throw new Error('No chunks found; check the build output.');
const bytes = chunks.reduce((total, chunk) =>
  total + gzipSync(readFileSync('.next/' + chunk.slice('/_next/'.length))).length, 0);
console.log({ chunks: chunks.length, bytes, KiB: (bytes / 1024).toFixed(1) });
JS
03 / Color contrast and interaction

Resolve each foreground and background token to sRGB. Convert each channel from sRGB to linear light; compute relative luminance as 0.2126R + 0.7152G + 0.0722B. Divide the lighter luminance plus 0.05 by the darker plus 0.05. The July palette's recorded ink-soft/canvas pair was 6.18:1. The current palette needs its own measurements.

Recalculate after palette changes. Then inspect focus indicators, complete navigation by keyboard, test a narrow screen, and enable reduced motion. One passing color pair is not a claim of sitewide accessibility conformance.

04 / Motion and media delivery

The six-second Higgsfield animation is a conceptual illustration of the gym operations system. The site serves optimized local video files; playback does not call the generation service. Actual website and app captures supply product evidence elsewhere.

Check the experience with reduced motion, Save-Data, a paused clip, and failed media loading. Test the playback controls by keyboard, confirm the still image remains available, and inspect transferred video bytes in the browser network panel. The project explanation should stay clear in every state.

Your project

Need something
like this?

Tell me what your team needs to do and what is getting in the way.

Talk about your project