Independent product · This website · 2026
BabakAI.Dev — Personal Portfolio
I built this bilingual portfolio with React, Next.js and TypeScript, and defined its Amazon S3 and CloudFront infrastructure with AWS CDK.
Screenshots
The problem
A CV is a list of claims. An employer should be able to see the work behind each one — in their own language, on any device — and find a skill in seconds.
What I built
- A statically exported Next.js 16 and React 19 site in English and Turkish: every page is pre-rendered HTML, and the Turkish dictionary is typed against the English one, so a missing translation is a compile error.
- Site-wide search (Ctrl/⌘ K) across projects, skills and roles that ignores accents, light and dark themes, and a language switch that keeps the current page.
- PDF CVs in both languages, printed from the CV page with Playwright at build time, so the PDF can never drift from the site.
- Build-time checks: a privacy rule over every page, every internal link and anchor, and the SEO tags (canonical address, hreflang, structured data).
- Tests in CI: Vitest unit tests, Playwright end-to-end tests on desktop and phone, and axe-core accessibility checks in both themes.
- AWS infrastructure as code with AWS CDK: a private S3 bucket behind CloudFront (Origin Access Control, HTTP/3, security headers), the certificate and DNS records, an edge function for the language redirect, and a deploy role GitHub Actions assumes through OpenID Connect — no stored keys.
- I deployed the site to AWS using GitHub Actions; the workflow runs every check again before it publishes.
Architecture
GitHub Actions
lint · tests · build · PDF CVs · checks
Amazon S3 (private)
uploaded with an OIDC role, no stored keys
Amazon CloudFront
HTTP/3 · security headers · edge function for language and paths
Visitor
English or Turkish, desktop or phone
Key decisions
Static, not a server
Every page is HTML at build time: nothing to patch or scale, and almost nothing to pay for.
The PDF is printed from the page
One source for the site and the CV, so the two can never disagree.
No stored cloud keys
The deploy job gets short-lived credentials through OpenID Connect, limited to one bucket and one distribution.