---
title: "Portfolio · Case study · Adrian Nita"
description: "This website. Two languages, static HTML, case studies and a CV generated from the same data, and code written together with Claude Code."
canonical_url: "https://www.adriannita.pl/en/projects/portfolio"
meta:
  "og:description": "This website. Two languages, static HTML, case studies and a CV generated from the same data, and code written together with Claude Code."
  "og:image": "https://www.adriannita.pl/_og/s/o_8ebaee489dc806fd.png"
  "og:image:height": "630"
  "og:image:type": image/png
  "og:image:width": "1200"
  "og:title": "Portfolio · Case study · Adrian Nita"
  "twitter:image": "https://www.adriannita.pl/_og/s/o_8ebaee489dc806fd.png"
---

> Index of every page on this site: [llms.txt](https://www.adriannita.pl/llms.txt)

[All projects](https://www.adriannita.pl/en#projects)

# **Portfolio**

This website. Two languages, static HTML, case studies and a CV generated from the same data, and code written together with Claude Code.

<dl>

<dt>Role</dt>
<dd>**Design, code with Claude Code, deployment**</dd>

<dt>Year</dt>
<dd>**2026**</dd>

<dt>Stack</dt>
<dd>**Nuxt 4, Vue, TypeScript, Tailwind CSS 4, Nuxt Content, Cloudflare Pages**</dd></dl>

- **1 day**

  from first commit to deploy
- **CSP**

  security headers on Cloudflare
- **PL / EN**

  two language versions
- **1 JSON**

  feeds both the page and the PDF CV

www.adriannita.pl

![Portfolio homepage: a headline about stores and panels with payments and APIs](https://www.adriannita.pl/_ipx/pos_top&f_webp&fit_cover&s_2208x1380/images/projects/portfolio.webp)

## The brief

I needed a site that shows in 30 seconds that I ship production systems, with a simple way to get in touch. Plus two languages and a CV that never drifts from the site.

## What I did

I set the plan, the architecture and the copy myself and wrote the code with Claude Code. I read every change and checked it in the browser before it went live.

## Decisions

### Static HTML

Pages are prerendered, so there is no server to look after. The only endpoint is the contact form, which runs as a function on Cloudflare.

### Animations in CSS

The header, the experience timeline and section entrances run on scroll-driven animations, without JavaScript. They switch off with reduced motion.

### E-mail assembled in the browser

The full address is in neither the HTML nor the bundle, so address-harvesting bots don't find it.

## What I fixed along the way

Section content waited for hydration and could stay invisible on a slow connection. I moved the reveal to CSS and a single observer that doesn't depend on sections loading.

The year in the footer and in the years count drifted between the HTML and the browser after New Year. It now comes from the build payload.

## The result

The site is live at [adriannita.pl](https://www.adriannita.pl/en). Every push goes through lint, types, tests and a build, and after deploy a smoke test checks the page and the form.

- ### **Animations in CSS**

  The header, the experience timeline and page transitions run on scroll-driven animations and View Transitions.
- ### **CSP and headers**

  A Content Security Policy with hashes of inline scripts and security headers on Cloudflare.
- ### **SEO**

  Schema.org ProfilePage, hreflang, a sitemap and OG images generated at build time.
- ### **CI/CD**

  Lint, types, tests and a build on every push, a smoke test after deploy and CalVer releases.

## **Got a similar project?**

Tell me in a few sentences what you want to build.

[**Talk about your project**](https://www.adriannita.pl/en#contact)

```json
{"@context":"https://schema.org","@graph":[{"@id":"https://www.adriannita.pl/en#website","@type":"WebSite","inLanguage":"en-US","name":"Adrian Nita","url":"https://www.adriannita.pl/en","publisher":{"@id":"https://www.adriannita.pl/#identity"},"translationOfWork":{"@id":"https://www.adriannita.pl/#website"}},{"@id":"https://www.adriannita.pl/en/projects/portfolio#webpage","@type":"WebPage","description":"This website. Two languages, static HTML, case studies and a CV generated from the same data, and code written together with Claude Code.","name":"Portfolio · Case study","url":"https://www.adriannita.pl/en/projects/portfolio","breadcrumb":{"@id":"https://www.adriannita.pl/en/projects/portfolio#breadcrumb"},"isPartOf":{"@id":"https://www.adriannita.pl/en#website"},"potentialAction":[{"@type":"ReadAction","target":["https://www.adriannita.pl/en/projects/portfolio"]}]},{"@id":"https://www.adriannita.pl/#identity","@type":"Person","jobTitle":"Fullstack developer","name":"Adrian Nita","url":"https://www.adriannita.pl","knowsAbout":["Laravel","PHP","Vue","Nuxt","TypeScript","E-commerce","REST API","Payment integrations"],"sameAs":["https://github.com/adrian-nita","https://www.linkedin.com/in/adrian-nita-01"]},{"@id":"https://www.adriannita.pl/en/projects/portfolio#article","@type":"Article","description":"This website. Two languages, static HTML, case studies and a CV generated from the same data, and code written together with Claude Code.","headline":"Portfolio","inLanguage":"en-US","thumbnailUrl":"https://www.adriannita.pl/images/projects/portfolio.webp","author":{"@id":"https://www.adriannita.pl/#identity"},"image":{"@id":"https://www.adriannita.pl/#/schema/image/1"},"isPartOf":{"@id":"https://www.adriannita.pl/en/projects/portfolio#webpage"},"mainEntityOfPage":{"@id":"https://www.adriannita.pl/en/projects/portfolio#webpage"},"publisher":{"@id":"https://www.adriannita.pl/#identity"}},{"@id":"https://www.adriannita.pl/en/projects/portfolio#breadcrumb","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","name":"Adrian Nita","item":"https://www.adriannita.pl/en","position":1},{"@type":"ListItem","name":"Portfolio","position":2}]},{"@id":"https://www.adriannita.pl/#/schema/image/1","@type":"ImageObject","contentUrl":"https://www.adriannita.pl/images/projects/portfolio.webp","inLanguage":"en-US","url":"https://www.adriannita.pl/images/projects/portfolio.webp"}]}
```

## Sitemap

See the full [sitemap](https://www.adriannita.pl/sitemap.md) for all pages.
