style: roman-inspired redesign with terracotta palette and Cinzel headings - #30
Conversation
…dings Transform the portfolio visual identity from modern blue/Inter to a warm Roman-inspired theme. The semantic token architecture means most changes cascade from tailwind.config.js — components reference semantic tokens rather than raw colors, so updating token values repaints the site. Palette: terracotta (#C2410C) primary replacing blue, warm marble whites for surfaces, warm charcoal text. Gold/amber accents preserved via accent hierarchy. Dark mode parity maintained — every semantic token has a -dark variant. Typography: Cinzel (classical serif) for h1-h4 via CSS variable --font-heading applied in layout. Inter retained for body text readability. Scope: - tailwind.config.js: new primary scale, recolored semantic tokens, added fontFamily.heading token, prose config auto-updates via theme() refs. - app/layout.tsx: load Cinzel alongside Inter, expose --font-heading variable, apply via <style> to all headings. - components/Tooltip: replace neutral-700 with surface-dark for warm dark-theme consistency, swap font-open-sans for font-body. - app/contact/page.tsx: strip undefined dark:shadow-sm-light variant that was silently dropped by Tailwind JIT. Verification: - pnpm lint, prettier, build, test all pass - WCAG AA contrast verified on 7 key foreground/background pairs - All semantic tokens resolve; no missing references - Dark mode parity confirmed across 8 components and 7 pages - Visual smoke via Playwright confirms Cinzel loads and terracotta renders Final Wave: F1 APPROVE | F2 APPROVE | F3 APPROVE | F4 APPROVE
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
📦 Next.js Bundle Analysis for tomsegbers-deThis analysis was generated by the Next.js Bundle Analysis action. 🤖 🎉 Global Bundle Size Decreased
DetailsThe global bundle is the javascript bundle that loads alongside every page. It is in its own category because its impact is much higher - an increase to its size means that every page on your website loads slower, and a decrease means every page loads faster. Any third party scripts you have added directly to your app using the If you want further insight into what is behind the changes, give @next/bundle-analyzer a try! Two Pages Changed SizeThe following pages changed size from the code in this PR compared to its base branch:
DetailsOnly the gzipped size is provided here based on an expert tip. First Load is the size of the global bundle plus the bundle for the individual page. If a user were to show up to your website and land on a given page, the first load size represents the amount of javascript that user would need to download. If Any third party scripts you have added directly to your app using the Next to the size is how much the size has increased or decreased compared with the base branch of this PR. If this percentage has increased by undefined% or more, there will be a red status indicator applied, indicating that special attention should be given to this. |
Canonical URLs in blog and project detail pages used the old tomsegbers.de domain, mismatching metadataBase (https://tom.segbers.de). Updated to match. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…Teaser.imageUrl Replaced two inline hero CTAs with existing Button component (primary/secondary lg variants). Removed unused imageUrl prop from ProjectTeaser's interface, destructure, JSDoc, test fixture, and Storybook story, plus 5 production callers. Applied readonly to re-touched ProjectProps. Deleted duplicate JPEG of hero portrait. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
…e baseline - Add rehype-pretty-code + remark-gfm for syntax-highlighted code blocks and GFM - Add reading time pill and TOC sidebar (IntersectionObserver scroll-spy) to blog detail - Add reading time pill to project detail - Add tags Zod schema + tag pills on blog/project detail pages - Add PageTransition (motion fade-in), HeroStagger (staggered hero), CardMotionWrapper (hover/tap) - All motion components respect prefers-reduced-motion via useReducedMotion() - Add /now, /uses pages with content/pages/ data layer - Add RSS feed (app/feed.xml/route.ts) - Add og-image routes (site-wide + per-blog-post) - Add BlogPosting/CreativeWork JSON-LD structured data on detail pages - Add per-post opengraph-image and canonical URL alignment - Add loading.tsx, error.tsx, global-error.tsx (App Router hygiene) - Add motion component smoke tests (CardMotionWrapper, HeroStagger, PageTransition) - Add Lighthouse CI workflow (.github/workflows/lighthouse.yml) - Add axe-playwright check to e2e static-routes spec - Rewrite DESIGN.md for Roman palette + Cinzel + Motion - Author peak-website blog post content - Wire Button component to homepage, remove dead imageUrl prop - Fix canonical URL to tom.segbers.de - Remove boilerplate TODO comment from homepage
📦 Next.js Bundle Analysis for tomsegbers-deThis analysis was generated by the Next.js Bundle Analysis action. 🤖 🎉 Global Bundle Size Decreased
DetailsThe global bundle is the javascript bundle that loads alongside every page. It is in its own category because its impact is much higher - an increase to its size means that every page on your website loads slower, and a decrease means every page loads faster. Any third party scripts you have added directly to your app using the If you want further insight into what is behind the changes, give @next/bundle-analyzer a try! New Pages AddedThe following pages were added to the bundle from the code in this PR:
Ten Pages Changed SizeThe following pages changed size from the code in this PR compared to its base branch:
DetailsOnly the gzipped size is provided here based on an expert tip. First Load is the size of the global bundle plus the bundle for the individual page. If a user were to show up to your website and land on a given page, the first load size represents the amount of javascript that user would need to download. If Any third party scripts you have added directly to your app using the Next to the size is how much the size has increased or decreased compared with the base branch of this PR. If this percentage has increased by undefined% or more, there will be a red status indicator applied, indicating that special attention should be given to this. |
…tsc, patch-package) Remove unused dependencies with zero imports across the codebase: Dependencies removed: - @vercel/otel — 3 production vulns, zero imports - prop-types — zero imports DevDependencies removed: - @opentelemetry/api, @opentelemetry/resources, @opentelemetry/sdk-node, @opentelemetry/sdk-trace-node, @opentelemetry/semantic-conventions — 5 packages, zero imports - @storybook/testing-library — deprecated package - @types/prop-types — companion to prop-types - patch-package — no patches/ directory exists, dead overhead - postinstall-postinstall — companion to patch-package - tsc@2.0.4 — wrong package shadows typescript compiler (typescript@5.3.2 kept) Scripts removed: - postinstall: npx patch-package -y (patch-package is dead) 88 transitive packages pruned. pnpm-lock.yaml regenerated. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Storybook 7 (EOL) contributed 39 of 67 Dependabot advisories: tar 11 critical, axios 23 high, esbuild 1 moderate, sharp 1 high, uuid 1 moderate, elliptic 1 low. Zero production value — 3 story files existed but no stories/ directory was ever consumed. Removed: - devDependencies: storybook, @storybook/addon-essentials, @storybook/addon-interactions, @storybook/addon-links, @storybook/blocks, @storybook/nextjs, @storybook/react, @storybook/test-runner, eslint-plugin-storybook (9 packages) - scripts: storybook, test-storybook, build-storybook - .storybook/ directory (main.ts, preview.ts) - 3 .stories.tsx files (Button, ArticleTeaser, ProjectTeaser) Config changes: - .eslintrc.js: removed plugin:storybook/recommended from extends - check.yml: replaced Storybook smoke tests with Playwright e2e - coupling-graph script: removed .storybook/ from --exclude pattern 583 transitive packages pruned. pnpm-lock.yaml regenerated. Verification: build (47 pages), test (91 tests), lint (warnings only), prettier (4 pre-existing issues on unmodified files). Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Restore repository-wide Prettier compliance without behavioral changes. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Remove animated duplicate-track marquee and opaque edge guards. Mobile uses native scroll-snap (snap-x snap-mandatory, w-screen cards); desktop uses responsive grid (md:grid-cols-2 xl:grid-cols-3). All project cards render whole within collection bounds. Dead Tailwind theme entries (spacing.112, zIndex.marquee, animation.marquee/marquee2, keyframes) removed. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Replace marquee assertions with collection geometry checks: scroll-snap-type at mobile, display:grid at desktop, visible card bounds within collection, keyboard Tab+Enter project link navigation. Reduced-motion test asserts native scroll-snap at mobile viewport. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Add project collection section to DESIGN.md §5: ordered semantic list, mobile snap-x snap-mandatory, desktop responsive grid. Remove marquee animation references from §6. Update motion table to reflect native scroll-snap pattern. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Extend Axe audit script to verify visible project cards do not cross collection edges. Assert fullyInside for all visible cards at 375/1280 light/dark. Require TASK_7_AUDIT_URL env var (remove default port fallback). Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Add plan, evidence ledger, boulder status, and four production screenshots (375/1280 light/dark). All gates green: Prettier, ESLint, 91/91 Jest, 47/47 build, 0 Axe contrast violations, 43/43 E2E twice, two visual QA oracles PASS. Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Create components/InlineAlert/InlineAlert.tsx — semantic <div role="alert"> with success/failure variants via CVA, dismissible button using lucide-react X icon. Replace Flowbite Alert in app/contact/page.tsx. Preserve fixed positioning for success alert, mb-6 for failure alert, and dismiss behavior. lucide-react added as dependency for X dismiss icon.
Create components/Breadcrumbs/Breadcrumbs.tsx — semantic <nav aria-label> with <ol>/<li> structure per WCAG breadcrumb pattern. CSS pseudo-element separator (/, hidden on last item). Replace HiHome from react-icons/hi with lucide-react Home icon in all 4 pages. Preserve href links, truncate className, and aria-current="page" semantics on current page item.
Create SurfaceCard component using CVA + tailwind-merge pattern, matching the Flowbite Card two-layer structure (root article + inner content div with p-6 padding). Replaces Card imports in ProjectTeaser and ArticleTeaser with zero flowbite-react Card references remaining.
Create ThemeToggle component using lucide-react Sun/Moon icons with CSS-driven icon visibility (no hydration mismatch). Uses same flowbite-theme-mode localStorage key as layout.tsx theme script. Updates dark-mode E2E test selector and test name to match new component. Navbar imports remain for task 12.
…nes, letter-spacing
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
📦 Next.js Bundle Analysis for tomsegbers-deThis analysis was generated by the Next.js Bundle Analysis action. 🤖
|
| Page | Size (compressed) |
|---|---|
global |
100.35 KB (🟢 15.15 KB) |
Details
The global bundle is the javascript bundle that loads alongside every page. It is in its own category because its impact is much higher - an increase to its size means that every page on your website loads slower, and a decrease means every page loads faster.
Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis
If you want further insight into what is behind the changes, give @next/bundle-analyzer a try!
New Pages Added
The following pages were added to the bundle from the code in this PR:
| Page | Size (compressed) | First Load |
|---|---|---|
/global-error |
530 B |
100.86 KB |
/error |
576 B |
100.91 KB |
/loading |
143 B |
100.49 KB |
/api/health/route |
143 B |
100.49 KB |
/feed.xml/route |
143 B |
100.49 KB |
/robots.txt/route |
143 B |
100.49 KB |
/sitemap.xml/route |
143 B |
100.49 KB |
/opengraph-image/route |
143 B |
100.49 KB |
/blog/entry/[slug]/opengraph-image/route |
143 B |
100.49 KB |
/now/page |
4.11 KB |
104.46 KB |
/uses/page |
4.11 KB |
104.46 KB |
Ten Pages Changed Size
The following pages changed size from the code in this PR compared to its base branch:
| Page | Size (compressed) | First Load |
|---|---|---|
/_not-found/page |
143 B (🟢 3 B) |
100.49 KB |
/not-found |
3.47 KB (🟢 3.33 KB) |
103.82 KB |
/layout |
27.2 KB (🟢 -60.44 KB) |
127.55 KB |
/contact/page |
9.82 KB (🟢 -54.31 KB) |
110.17 KB |
/about/page |
5.53 KB (🟢 325 B) |
105.88 KB |
/blog/page |
8.72 KB (🟢 -63.37 KB) |
109.07 KB |
/blog/entry/[slug]/page |
5.06 KB (🟢 -53.52 KB) |
105.4 KB |
/projects/entry/[slug]/page |
4.11 KB (🟢 -54.47 KB) |
104.45 KB |
/projects/page |
25.22 KB (🟢 -55.86 KB) |
125.57 KB |
/page |
25.36 KB (🟢 -55.73 KB) |
125.7 KB |
Details
Only the gzipped size is provided here based on an expert tip.
First Load is the size of the global bundle plus the bundle for the individual page. If a user were to show up to your website and land on a given page, the first load size represents the amount of javascript that user would need to download. If next/link is used, subsequent page loads would only need to download that page's bundle (the number in the "Size" column), since the global bundle has already been downloaded.
Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis
Next to the size is how much the size has increased or decreased compared with the base branch of this PR. If this percentage has increased by undefined% or more, there will be a red status indicator applied, indicating that special attention should be given to this.
…es in package.json
📦 Next.js Bundle Analysis for tomsegbers-deThis analysis was generated by the Next.js Bundle Analysis action. 🤖
|
| Page | Size (compressed) |
|---|---|
global |
100.35 KB (🟢 15.15 KB) |
Details
The global bundle is the javascript bundle that loads alongside every page. It is in its own category because its impact is much higher - an increase to its size means that every page on your website loads slower, and a decrease means every page loads faster.
Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis
If you want further insight into what is behind the changes, give @next/bundle-analyzer a try!
New Pages Added
The following pages were added to the bundle from the code in this PR:
| Page | Size (compressed) | First Load |
|---|---|---|
/global-error |
530 B |
100.86 KB |
/error |
576 B |
100.91 KB |
/loading |
143 B |
100.49 KB |
/api/health/route |
143 B |
100.49 KB |
/feed.xml/route |
143 B |
100.49 KB |
/blog/entry/[slug]/opengraph-image/route |
143 B |
100.49 KB |
/robots.txt/route |
143 B |
100.49 KB |
/sitemap.xml/route |
143 B |
100.49 KB |
/opengraph-image/route |
143 B |
100.49 KB |
/now/page |
4.11 KB |
104.46 KB |
/uses/page |
4.11 KB |
104.46 KB |
Ten Pages Changed Size
The following pages changed size from the code in this PR compared to its base branch:
| Page | Size (compressed) | First Load |
|---|---|---|
/_not-found/page |
143 B (🟢 3 B) |
100.49 KB |
/not-found |
3.47 KB (🟢 3.33 KB) |
103.82 KB |
/layout |
27.2 KB (🟢 -60.44 KB) |
127.55 KB |
/contact/page |
9.82 KB (🟢 -54.31 KB) |
110.17 KB |
/about/page |
5.53 KB (🟢 325 B) |
105.88 KB |
/blog/page |
8.72 KB (🟢 -63.37 KB) |
109.07 KB |
/blog/entry/[slug]/page |
5.06 KB (🟢 -53.52 KB) |
105.4 KB |
/projects/entry/[slug]/page |
4.11 KB (🟢 -54.47 KB) |
104.45 KB |
/projects/page |
25.22 KB (🟢 -55.86 KB) |
125.57 KB |
/page |
25.36 KB (🟢 -55.73 KB) |
125.7 KB |
Details
Only the gzipped size is provided here based on an expert tip.
First Load is the size of the global bundle plus the bundle for the individual page. If a user were to show up to your website and land on a given page, the first load size represents the amount of javascript that user would need to download. If next/link is used, subsequent page loads would only need to download that page's bundle (the number in the "Size" column), since the global bundle has already been downloaded.
Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis
Next to the size is how much the size has increased or decreased compared with the base branch of this PR. If this percentage has increased by undefined% or more, there will be a red status indicator applied, indicating that special attention should be given to this.
📦 Next.js Bundle Analysis for tomsegbers-deThis analysis was generated by the Next.js Bundle Analysis action. 🤖
|
| Page | Size (compressed) |
|---|---|
global |
100.35 KB (🟢 15.15 KB) |
Details
The global bundle is the javascript bundle that loads alongside every page. It is in its own category because its impact is much higher - an increase to its size means that every page on your website loads slower, and a decrease means every page loads faster.
Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis
If you want further insight into what is behind the changes, give @next/bundle-analyzer a try!
New Pages Added
The following pages were added to the bundle from the code in this PR:
| Page | Size (compressed) | First Load |
|---|---|---|
/global-error |
530 B |
100.86 KB |
/error |
576 B |
100.91 KB |
/loading |
143 B |
100.49 KB |
/api/health/route |
143 B |
100.49 KB |
/feed.xml/route |
143 B |
100.49 KB |
/robots.txt/route |
143 B |
100.49 KB |
/sitemap.xml/route |
143 B |
100.49 KB |
/opengraph-image/route |
143 B |
100.49 KB |
/blog/entry/[slug]/opengraph-image/route |
143 B |
100.49 KB |
/now/page |
4.11 KB |
104.46 KB |
/uses/page |
4.11 KB |
104.46 KB |
Ten Pages Changed Size
The following pages changed size from the code in this PR compared to its base branch:
| Page | Size (compressed) | First Load |
|---|---|---|
/_not-found/page |
143 B (🟢 3 B) |
100.49 KB |
/not-found |
3.47 KB (🟢 3.33 KB) |
103.82 KB |
/layout |
27.2 KB (🟢 -60.44 KB) |
127.55 KB |
/contact/page |
9.82 KB (🟢 -54.31 KB) |
110.17 KB |
/about/page |
5.53 KB (🟢 325 B) |
105.88 KB |
/blog/page |
8.72 KB (🟢 -63.37 KB) |
109.07 KB |
/blog/entry/[slug]/page |
5.06 KB (🟢 -53.52 KB) |
105.4 KB |
/page |
25.36 KB (🟢 -55.73 KB) |
125.7 KB |
/projects/page |
25.22 KB (🟢 -55.86 KB) |
125.57 KB |
/projects/entry/[slug]/page |
4.11 KB (🟢 -54.47 KB) |
104.45 KB |
Details
Only the gzipped size is provided here based on an expert tip.
First Load is the size of the global bundle plus the bundle for the individual page. If a user were to show up to your website and land on a given page, the first load size represents the amount of javascript that user would need to download. If next/link is used, subsequent page loads would only need to download that page's bundle (the number in the "Size" column), since the global bundle has already been downloaded.
Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis
Next to the size is how much the size has increased or decreased compared with the base branch of this PR. If this percentage has increased by undefined% or more, there will be a red status indicator applied, indicating that special attention should be given to this.
📦 Next.js Bundle Analysis for tomsegbers-deThis analysis was generated by the Next.js Bundle Analysis action. 🤖
|
| Page | Size (compressed) |
|---|---|
global |
100.35 KB (🟢 15.15 KB) |
Details
The global bundle is the javascript bundle that loads alongside every page. It is in its own category because its impact is much higher - an increase to its size means that every page on your website loads slower, and a decrease means every page loads faster.
Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis
If you want further insight into what is behind the changes, give @next/bundle-analyzer a try!
New Pages Added
The following pages were added to the bundle from the code in this PR:
| Page | Size (compressed) | First Load |
|---|---|---|
/global-error |
530 B |
100.86 KB |
/error |
576 B |
100.91 KB |
/loading |
143 B |
100.49 KB |
/api/health/route |
143 B |
100.49 KB |
/feed.xml/route |
143 B |
100.49 KB |
/robots.txt/route |
143 B |
100.49 KB |
/sitemap.xml/route |
143 B |
100.49 KB |
/opengraph-image/route |
143 B |
100.49 KB |
/blog/entry/[slug]/opengraph-image/route |
143 B |
100.49 KB |
/now/page |
4.11 KB |
104.46 KB |
/uses/page |
4.11 KB |
104.46 KB |
Ten Pages Changed Size
The following pages changed size from the code in this PR compared to its base branch:
| Page | Size (compressed) | First Load |
|---|---|---|
/_not-found/page |
143 B (🟢 3 B) |
100.49 KB |
/not-found |
3.47 KB (🟢 3.33 KB) |
103.82 KB |
/layout |
27.2 KB (🟢 -60.44 KB) |
127.55 KB |
/contact/page |
9.82 KB (🟢 -54.31 KB) |
110.16 KB |
/about/page |
5.53 KB (🟢 325 B) |
105.88 KB |
/blog/page |
8.72 KB (🟢 -63.37 KB) |
109.07 KB |
/projects/page |
25.22 KB (🟢 -55.86 KB) |
125.57 KB |
/blog/entry/[slug]/page |
5.06 KB (🟢 -53.52 KB) |
105.4 KB |
/projects/entry/[slug]/page |
4.11 KB (🟢 -54.47 KB) |
104.45 KB |
/page |
25.36 KB (🟢 -55.73 KB) |
125.7 KB |
Details
Only the gzipped size is provided here based on an expert tip.
First Load is the size of the global bundle plus the bundle for the individual page. If a user were to show up to your website and land on a given page, the first load size represents the amount of javascript that user would need to download. If next/link is used, subsequent page loads would only need to download that page's bundle (the number in the "Size" column), since the global bundle has already been downloaded.
Any third party scripts you have added directly to your app using the <script> tag are not accounted for in this analysis
Next to the size is how much the size has increased or decreased compared with the base branch of this PR. If this percentage has increased by undefined% or more, there will be a red status indicator applied, indicating that special attention should be given to this.
Peak Website Transformation
Roman Redesign (base)
#C2410Caccent), semantic design tokensContent Depth (T1-T3)
/nowpage — current focus page with markdown content/usespage — tools/stack page with markdown content2026-peak-websiteblog post — meta post about the transformation itselfcontent/pages/directory +lib/pages.tsxdata layerReading UX (T4-T5)
?tag=links on both detail page typesSyntax Highlighting & SEO (T6)
rehype-pretty-code(Shiki) —github-dark-dimmed/github-lightthemesrehype-slug+rehype-autolink-headingsfor anchor-linked headingsremark-gfmfor tables, strikethrough, task listsopengraph-image.tsx+ site-wide OG image routeMotion Polish (T7)
PageTransition— fade-in page reveal in root layoutHeroStagger— staggered hero entrance on homepageCardMotionWrapper— hover lift + tap scale on ArticleTeaser/ProjectTeaseruseReducedMotion()— animations disabled whenprefers-reduced-motion: reduceApp Router Hygiene (T8)
app/loading.tsx— skeleton loading stateapp/error.tsx— error boundary with retryapp/global-error.tsx— global error fallbackContent Distribution (T9)
/feed.xml(all blog posts)<link rel="alternate">in root layout metadataPerformance & a11y (T10)
.github/workflows/lighthouse.yml— Lighthouse CI on 6 routes (non-blocking)@axe-core/playwrightintegrated ine2e/static-routes.spec.tsCanonical URL Fix (T2)
tomsegbers.de→tom.segbers.deButtoncomponent wired to homepage hero CTAsProjectTeaser.imageUrlprop removedVerification
pnpm build— 47 static pages, exit 0pnpm test— 15 suites, 91 tests, all passpnpm lint— 0 errorsScope IN (delivered)
Content depth, reading UX, hire-manager signals, motion polish, performance baseline, a11y baseline, App Router hygiene, content tags, syntax highlighting, RSS feed, /now + /uses, DESIGN.md rewrite
Scope OUT (not included — by design)
No view counters, no newsletter, no MDX, no search, no GSAP, no view-transitions API, no image CDN, no i18n, no analytics, no comments, no CMS, no dark mode toggle, no tag filter pages