Skip to content

style: roman-inspired redesign with terracotta palette and Cinzel headings - #30

Merged
TomSeestern merged 70 commits into
mainfrom
roman-redesign
Jul 23, 2026
Merged

style: roman-inspired redesign with terracotta palette and Cinzel headings#30
TomSeestern merged 70 commits into
mainfrom
roman-redesign

Conversation

@TomSeestern

@TomSeestern TomSeestern commented Jul 21, 2026

Copy link
Copy Markdown
Owner

Peak Website Transformation

Roman Redesign (base)

  • Terracotta palette (#C2410C accent), semantic design tokens
  • Cinzel headings + Inter body typography
  • Warm marble surface tokens, travertine-inspired backgrounds
  • Dark mode parity preserved throughout

Content Depth (T1-T3)

  • /now page — current focus page with markdown content
  • /uses page — tools/stack page with markdown content
  • 2026-peak-website blog post — meta post about the transformation itself
  • content/pages/ directory + lib/pages.tsx data layer

Reading UX (T4-T5)

  • Reading time pill on both blog and project detail pages (200 wpm)
  • Table of Contents sidebar on blog detail (IntersectionObserver scroll-spy)
  • Tag pills with ?tag= links on both detail page types

Syntax Highlighting & SEO (T6)

  • rehype-pretty-code (Shiki) — github-dark-dimmed / github-light themes
  • rehype-slug + rehype-autolink-headings for anchor-linked headings
  • remark-gfm for tables, strikethrough, task lists
  • BlogPosting JSON-LD on blog detail, CreativeWork on project detail
  • Per-post opengraph-image.tsx + site-wide OG image route

Motion Polish (T7)

  • PageTransition — fade-in page reveal in root layout
  • HeroStagger — staggered hero entrance on homepage
  • CardMotionWrapper — hover lift + tap scale on ArticleTeaser/ProjectTeaser
  • All 3 components use useReducedMotion() — animations disabled when prefers-reduced-motion: reduce

App Router Hygiene (T8)

  • app/loading.tsx — skeleton loading state
  • app/error.tsx — error boundary with retry
  • app/global-error.tsx — global error fallback

Content Distribution (T9)

  • RSS 2.0 feed at /feed.xml (all blog posts)
  • <link rel="alternate"> in root layout metadata

Performance & a11y (T10)

  • .github/workflows/lighthouse.yml — Lighthouse CI on 6 routes (non-blocking)
  • @axe-core/playwright integrated in e2e/static-routes.spec.ts
  • DESIGN.md rewritten for Roman palette + Cinzel + Motion

Canonical URL Fix (T2)

  • Canonical URL aligned: tomsegbers.detom.segbers.de
  • Button component wired to homepage hero CTAs
  • Dead ProjectTeaser.imageUrl prop removed

Verification

  • pnpm build — 47 static pages, exit 0
  • pnpm test — 15 suites, 91 tests, all pass
  • pnpm lint — 0 errors
  • Final Wave F1-F4: all APPROVE

Scope 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

…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
@vercel

vercel Bot commented Jul 21, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
tomsegbers-de Ready Ready Preview, Comment Jul 23, 2026 4:37pm

Request Review

@github-actions

Copy link
Copy Markdown

📦 Next.js Bundle Analysis for tomsegbers-de

This analysis was generated by the Next.js Bundle Analysis action. 🤖

🎉 Global Bundle Size Decreased

Page Size (compressed)
global 85.2 KB (-1 B)
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!

Two Pages Changed Size

The following pages changed size from the code in this PR compared to its base branch:

Page Size (compressed) First Load
/layout 88.06 KB (🟢 428 B) 173.25 KB
/contact/page 64.12 KB (🟢 -10 B) 149.32 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.

TomSeestern and others added 4 commits July 21, 2026 23:36
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
@github-actions

Copy link
Copy Markdown

📦 Next.js Bundle Analysis for tomsegbers-de

This analysis was generated by the Next.js Bundle Analysis action. 🤖

🎉 Global Bundle Size Decreased

Page Size (compressed)
global 85.2 KB (-1 B)
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
/error 544 B 85.73 KB
/loading 144 B 85.34 KB
/global-error 475 B 85.66 KB
/now/page 58.58 KB 143.77 KB
/uses/page 58.58 KB 143.77 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 144 B (🟢 4 B) 85.34 KB
/_not-found/page 144 B (🟢 4 B) 85.34 KB
/layout 127.61 KB (🟢 39.97 KB) 212.81 KB
/contact/page 64.12 KB (🟢 -10 B) 149.32 KB
/blog/page 111.38 KB (🟢 39.28 KB) 196.58 KB
/about/page 5.32 KB (🟢 102 B) 90.51 KB
/blog/entry/[slug]/page 68.1 KB (🟢 9.53 KB) 153.3 KB
/page 120.55 KB (🟢 39.46 KB) 205.75 KB
/projects/page 120.37 KB (🟢 39.28 KB) 205.56 KB
/projects/entry/[slug]/page 67.07 KB (🟢 8.5 KB) 152.27 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.

TomSeestern and others added 20 commits July 22, 2026 15:47
…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>
TomSeestern and others added 17 commits July 23, 2026 00:51
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.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
@github-actions

Copy link
Copy Markdown

📦 Next.js Bundle Analysis for tomsegbers-de

This analysis was generated by the Next.js Bundle Analysis action. 🤖

⚠️ Global Bundle Size Increased

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.

@github-actions

Copy link
Copy Markdown

📦 Next.js Bundle Analysis for tomsegbers-de

This analysis was generated by the Next.js Bundle Analysis action. 🤖

⚠️ Global Bundle Size Increased

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.

@github-actions

Copy link
Copy Markdown

📦 Next.js Bundle Analysis for tomsegbers-de

This analysis was generated by the Next.js Bundle Analysis action. 🤖

⚠️ Global Bundle Size Increased

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.

@github-actions

Copy link
Copy Markdown

📦 Next.js Bundle Analysis for tomsegbers-de

This analysis was generated by the Next.js Bundle Analysis action. 🤖

⚠️ Global Bundle Size Increased

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.

@TomSeestern
TomSeestern merged commit b0201d3 into main Jul 23, 2026
6 checks passed
@TomSeestern
TomSeestern deleted the roman-redesign branch July 23, 2026 20:39
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