Skip to content

feat: the clients' photos and LinkedIn links under What clients said, a daily link check, and release 1.11.0 - #19

Merged
anaidenko merged 2 commits into
mainfrom
feat/testimonial-photos
Oct 9, 2026
Merged

anaidenko merged 2 commits into
mainfrom
feat/testimonial-photos

Conversation

@anaidenko

Copy link
Copy Markdown
Owner

Each review under "What clients said" now opens with the client: a round photo (their LinkedIn
profile photo, cropped to the face; 144 px files for a 48 px circle, 40 px on a phone), the name
with a small LinkedIn icon, the company and how they hired me, then the quote. On naidenko.dev the
name and the photo open the client's LinkedIn profile in a new tab. The photo's link is out of the
tab order and hidden from screen readers; the name's is labelled "… on LinkedIn (opens in a new
tab)". Clicks count as testimonial_click with the client. The Toptal build shows the photos and
names without links, since it links no LinkedIn profile, and /index.md links the names the same
way.

Links are now checked twice over. scripts/check-links.mjs fails a build whose page links a page,
file or anchor the build lacks; pnpm run deploy and CI run it on both builds. The Worker's daily
cron (17 3 * * *, beside the retention job) checks the outside links and posts broken ones to
Slack with the pages that carry them: the home page's every day, the sample report's 105
references fifteen a day, within a Free plan's 50 subrequests (redirects followed by hand and
counted). A 404, 410, network error, timeout or redirect loop, twice in a row, is broken; 401,
403, 429 and 5xx go to the logs as unverified, since EPAM and GlobalLogic answer that way to any
script. LinkedIn (999 for anything) and Toptal (its terms bar scripts) are not fetched.

Tests: unit tests red first (the link checks, the Markdown's linked names), e2e tests for the
photos, the links, the Toptal build and the click event. Checks on this tree: format, lint, types,
294 unit tests, e2e 226 passed and 12 skipped. The cron ran locally (wrangler dev --test-scheduled) against the real links: 27 of 28 answered, GlobalLogic's 503 logged as
unverified, nothing posted.

Each review under "What clients said" now opens with the client: a round photo (their LinkedIn
profile photo, cropped to the face, 144 px for a 48 px circle), the name with a small LinkedIn
icon, the company and how they hired me, then the quote. On naidenko.dev the name and the photo
open the client's LinkedIn profile in a new tab; the photo's link is out of the tab order and
hidden from screen readers, and the name's says "… on LinkedIn (opens in a new tab)". Clicks
count as testimonial_click with the client. The Toptal build shows the photos and names without
links, as it links no LinkedIn profile. /index.md links the names the same way.
scripts/check-links.mjs fails a build whose page links a page, file or anchor the build lacks,
naidenko.dev and toptal.naidenko.dev written in full included; `pnpm run deploy` and CI run it on
both builds.

The Worker's daily cron (17 3 * * *, beside the retention job) reads the sitemap's pages from the
deployed build and posts broken outside links to Slack with the pages that carry them. The site
has 118 outside links, 105 of them the sample report's references, and a Free plan's cron may
make 50 subrequests, so the home page's links go every day and the others fifteen a day, with
redirects followed by hand and counted, 40 requests at most. A 404, 410, network error, timeout or
redirect loop, twice in a row, is broken; a 401, 403, 429 or 5xx is a bot wall as often as not
(EPAM's Cloudflare challenge, GlobalLogic's Imperva), so it goes to the logs as unverified.
LinkedIn answers 999 to any script and Toptal's terms bar scripts: neither is fetched.
@anaidenko
anaidenko merged commit af502c9 into main Oct 9, 2026
1 check passed
@anaidenko
anaidenko deleted the feat/testimonial-photos branch October 9, 2026 23:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant