diff --git a/apps/web/src/features/homepage/design.tsx b/apps/web/src/features/homepage/design.tsx
index 6f0b797ed..7a65b46fb 100644
--- a/apps/web/src/features/homepage/design.tsx
+++ b/apps/web/src/features/homepage/design.tsx
@@ -91,7 +91,7 @@ const pageLabel = "font-martian font-medium text-[calc(var(--pw)*.045)] leading-
/**
* 02 Design. The word "Design." changes its type as five templates wipe across the page in turn, then the scene
- * zooms out to a contact sheet of all fifteen. The template tabs jump to each wipe.
+ * zooms out to a contact sheet of illustrative thumbnails. The template tabs jump to each wipe.
*
* Everything that moves with the scroll sits on its own layer (will-change), and the wipes slide clipped layers
* rather than animating clip-path. Otherwise every scrolled frame repaints the whole sticky stage, which Android
diff --git a/apps/web/src/features/homepage/sections.tsx b/apps/web/src/features/homepage/sections.tsx
index 5b0674d4c..da949372c 100644
--- a/apps/web/src/features/homepage/sections.tsx
+++ b/apps/web/src/features/homepage/sections.tsx
@@ -5,6 +5,7 @@ import { useLingui } from "@lingui/react";
import { Trans } from "@lingui/react/macro";
import { useQuery } from "@tanstack/react-query";
import { useEffect, useState } from "react";
+import { templateSchema } from "@reactive-resume/schema/templates";
import { Icon } from "@reactive-resume/ui/components/icon";
import { localeSchema } from "@reactive-resume/utils/locale";
import { cn } from "@reactive-resume/utils/style";
@@ -216,7 +217,7 @@ export function Support() {
// oxlint-disable-next-line react/purity -- The receipt shows the current calendar date on each render, including after midnight.
const receiptDate = new Date();
const nothing = i18n.number(0, { minimumFractionDigits: 2, maximumFractionDigits: 2 });
- const templates = i18n.number(15);
+ const templates = i18n.number(templateSchema.options.length);
const none = t({
message: "none",
comment: "Receipt line amount for something Reactive Resume doesn't have, e.g. ads.",
diff --git a/docs/changelog/index.mdx b/docs/changelog/index.mdx
index 2a8d27958..190f77d52 100644
--- a/docs/changelog/index.mdx
+++ b/docs/changelog/index.mdx
@@ -4,7 +4,7 @@ description: "Release notes for Reactive Resume covering new features, resume bu
rss: true
---
-
+
+
+
## Features & Improvements
@@ -1351,7 +1374,8 @@ production deployments.
- Downgraded the Cosign installer action to v3 in the Docker build workflow for more reliable image signing.
- Synced translation catalogs from Crowdin. [#2864](https://github.com/reactive-resume/reactive-resume/pull/2864)
- Dependency and lockfile updates (including changes bundled with MCP and analysis work).
-
+
+
## Features & Improvements
@@ -1367,7 +1391,8 @@ production deployments.
- Synced translation catalogs across all supported locales.
- Updated dependencies and lockfile, including AI SDK, TipTap, TanStack Query, and Vite+ package aliases.
-
+
+
## Features & Improvements
@@ -1400,7 +1425,8 @@ production deployments.
- Updated self-hosting and environment variable documentation to include LinkedIn OAuth configuration.
- Synced translations across locales for the latest authentication and save-status messaging.
-
+
+
## Features
@@ -1410,7 +1436,8 @@ production deployments.
## Fixes
- Fixed an issue with the slider component for "Sidebar Width" in the resume builder. [#2830](https://github.com/reactive-resume/reactive-resume/issues/2830)
-
+
+
## Features & Improvements
@@ -1446,7 +1473,8 @@ production deployments.
- @lukadfagundes
- @Hephaisto-dev
-
+
+
## Features & Improvements
@@ -1477,7 +1505,8 @@ production deployments.
- @FrancocDev
- @obitton
- @jondycz
-
+
+
## Fixes
@@ -1506,7 +1535,8 @@ production deployments.
- Refactored auth utility from `originWith` to `withHostname` to preserve localhost/127.0.0.1 sibling trust.
- Updated dependencies and improved code style.
- Updated documentation and README files.
-
+
+
## Features & Improvements - Added Computer Modern web fonts to the font selector, allowing users to choose from
@@ -1536,7 +1566,8 @@ production deployments.
## Maintenance
- Updated dependencies to latest versions.
-
+
+
## Features & Improvements
@@ -1552,7 +1583,8 @@ production deployments.
- General bug fixes and minor improvements.
- Synced latest translations from Crowdin (notably: French, other languages).
- Updated dependencies to latest versions.
-
+
+
## Features & Improvements
@@ -1565,7 +1597,8 @@ production deployments.
- Fixed keyword spacing issue in the interests section. [#2631](https://github.com/reactive-resume/reactive-resume/pull/2631)
- Fixed AI connection test and improved error reporting for AI provider issues.
-
+
+
## Features & Improvements
@@ -1589,7 +1622,8 @@ production deployments.
- Updated package dependencies and fixed self-hosting guide links in README.
- Removed dead code and updated screenshots.
- Other bug fixes and minor improvements (#2542, #2573, #2598).
-
+
+
## Features & Improvements
@@ -1604,7 +1638,8 @@ production deployments.
- Homepage video optimized for faster loading without quality loss.
- Increased screenshot TTL for resumes to reduce unnecessary regenerations.
- Updated dependencies and translations to latest versions.
-
+
+
## Features & Improvements
@@ -1618,7 +1653,8 @@ production deployments.
- Updated JSON Schema for proper format.
- Updated Discord server invite link.
- Updated dependencies to latest versions.
-
+
+
## Maintenance & Fixes - Updated translations from Crowdin. - Added Community Spotlight section to the documentation.
diff --git a/docs/community/spotlight.mdx b/docs/community/spotlight.mdx
index dff0fc8b1..741ff743a 100644
--- a/docs/community/spotlight.mdx
+++ b/docs/community/spotlight.mdx
@@ -17,14 +17,6 @@ A collection of blog posts and articles written by the community about Reactive
{/* Add article cards here */}
-{/\*
-Example:
-
-
-A brief description of the article.
-
-*/}
-
No articles have been featured yet.
@@ -38,14 +30,6 @@ Video tutorials, reviews, and walkthroughs created by the community.
{/* Add video cards here */}
-{/\*
-Example:
-
-
-A brief description of the video.
-
-*/}
-
No videos have been featured yet.
@@ -59,14 +43,6 @@ Posts and threads from social media platforms sharing experiences with Reactive
{/* Add social media cards here */}
-{/\*
-Example:
-
-
-A brief description of the post.
-
-*/}
-
No social media posts have been featured yet.
diff --git a/docs/comparisons/reactive-resume-vs-overleaf.mdx b/docs/comparisons/reactive-resume-vs-overleaf.mdx
index a9ed37735..655cc5e69 100644
--- a/docs/comparisons/reactive-resume-vs-overleaf.mdx
+++ b/docs/comparisons/reactive-resume-vs-overleaf.mdx
@@ -12,7 +12,7 @@ The two products use different authoring models. Overleaf is an online LaTeX edi
| Consideration | Reactive Resume | Overleaf |
| ---------------- | ------------------------------------------------------------------- | --------------------------------------------------------- |
| Primary workflow | Visual resume editing with structured sections | LaTeX source editing and compilation |
-| Template model | 15 built-in resume templates with font, colour, and layout settings | Community CV and resume LaTeX templates |
+| Template model | 17 built-in resume templates with font, colour, and layout settings | Community CV and resume LaTeX templates |
| Source control | Resume JSON export, not LaTeX source | Direct editing of LaTeX project files |
| Collaboration | No shared editing; public links with optional password for readers | Project collaboration with plan-dependent limits |
| Output | PDF, Word (DOCX), Markdown, and Reactive Resume JSON | Compiled document PDFs and project source |
diff --git a/docs/docs.json b/docs/docs.json
index b05370681..18e5b3087 100644
--- a/docs/docs.json
+++ b/docs/docs.json
@@ -69,6 +69,7 @@
"pages": [
"getting-started",
"getting-started/quickstart",
+ "guides/video-guides",
"guides/whats-new-in-v6",
"guides/using-the-command-bar",
"guides/keyboard-shortcuts",
diff --git a/docs/getting-started.mdx b/docs/getting-started.mdx
index bd6ddddc1..ebbb4b2b5 100644
--- a/docs/getting-started.mdx
+++ b/docs/getting-started.mdx
@@ -63,6 +63,10 @@ account from **Settings**, and delete your account at any time. The source code
Used Reactive Resume before? See what changed and where things moved.
+
+ Watch short walkthroughs of creating, improving and sharing a resume, writing a cover letter and tracking
+ applications.
+
Run Reactive Resume on your own server.
diff --git a/docs/getting-started/quickstart.mdx b/docs/getting-started/quickstart.mdx
index 522ef122d..7eecedefb 100644
--- a/docs/getting-started/quickstart.mdx
+++ b/docs/getting-started/quickstart.mdx
@@ -99,7 +99,7 @@ You don't need to save. Under the document name, the status changes to **Saving
diff --git a/docs/guides/choosing-a-template.mdx b/docs/guides/choosing-a-template.mdx
index a43f648de..24befb5b0 100644
--- a/docs/guides/choosing-a-template.mdx
+++ b/docs/guides/choosing-a-template.mdx
@@ -1,6 +1,6 @@
---
title: "Choosing a template"
-description: "Browse the 15 Reactive Resume templates drawn with your own content, preview one on the page, and apply it without losing any of your work."
+description: "Browse the 17 Reactive Resume templates drawn with your own content, preview one on the page, and apply it without losing any of your work."
---
A template decides the layout of your resume: where the header sits, whether there is a sidebar, and how headings and entries look. You can switch templates at any time. Your content, fonts and colors stay the same.
@@ -21,7 +21,7 @@ A template decides the layout of your resume: where the header sits, whether the
@@ -38,7 +38,7 @@ The chips above the thumbnails narrow the list:
| **Two columns** | Templates with a separate sidebar column. |
| **ATS-safe** | Templates with one reading order and plain text headings, which applicant tracking systems read cleanly. |
-The counter on the right (for example "7 of 15 shown") tells you how many templates match.
+The counter on the right (for example "7 of 17 shown") tells you how many templates match.
## Preview and apply a template
diff --git a/docs/guides/video-guides.mdx b/docs/guides/video-guides.mdx
new file mode 100644
index 000000000..5edbf067b
--- /dev/null
+++ b/docs/guides/video-guides.mdx
@@ -0,0 +1,231 @@
+---
+title: "Video Guides"
+description: "Short video walkthroughs for creating and importing resumes, improving your design, checking PDFs, using AI, writing cover letters and tracking job applications."
+icon: "circle-play"
+---
+
+Watch a task from start to finish in under a minute. These YouTube Shorts show you how to use Reactive Resume.
+
+New here? Start with **Create an account** and **Create your first resume**, then pick the task you need.
+
+## Start your resume
+
+
+
+
+ Sign up and choose the username for your public resume link.
+
+
+
+ [Read the guide](/guides/creating-an-account) · [Watch on YouTube](https://www.youtube.com/shorts/O3n6_a5N2IA)
+
+
+
+
+ Start from a sample, replace its details, choose a template and download a PDF.
+
+
+
+ [Read the guide](/getting-started/quickstart) · [Watch on YouTube](https://www.youtube.com/shorts/ufQ_ofhlU8k)
+
+
+
+
+ Bring in a PDF, LinkedIn export or JSON file, then review the imported sections.
+
+
+
+ [Read the guide](/guides/importing-resumes) · [Watch on YouTube](https://www.youtube.com/shorts/4LoWWE3_Ujc)
+
+
+
+
+ Add an Experience section and fill in your positions, companies and dates.
+
+
+
+ [Read the guide](/guides/editing-entries) · [Watch on YouTube](https://www.youtube.com/shorts/bYh32r69x3k)
+
+
+
+
+
+## Improve your resume
+
+
+
+
+ See where your resume overflows and use Fit to one page to adjust the design.
+
+
+
+ [Read the guide](/guides/fitting-content-on-a-page) · [Watch on YouTube](https://www.youtube.com/shorts/yxzyhE5xOhU)
+
+
+
+
+ Find issues on the page and apply fixes to help hiring software read your resume.
+
+
+
+ [Read the guide](/guides/checking-your-resume) · [Watch on YouTube](https://www.youtube.com/shorts/XUVKGe0UUFY)
+
+
+
+
+ Use the standalone ATS checker to inspect a PDF and see the text software reads.
+
+
+
+ [Read the guide](/guides/using-the-ats-checker) · [Watch on YouTube](https://www.youtube.com/shorts/AFiIi9w3hO4)
+
+
+
+
+ Connect your own AI provider, ask for a change and review each proposed edit.
+
+
+
+ [Read the guide](/guides/using-the-assistant) · [Watch on YouTube](https://www.youtube.com/shorts/TN1x7Gb_kxw)
+
+
+
+
+
+## Apply and share
+
+
+
+
+ Copy your resume for a saved job and compare it with the posting in Job match.
+
+
+
+ [Read the guide](/guides/tailoring-a-resume-for-a-job) · [Watch on YouTube](https://www.youtube.com/shorts/wsVo4ZMxEcE)
+
+
+
+
+ Create a letter, link an application and match the design to your resume.
+
+
+
+ [Read the guide](/guides/writing-a-cover-letter) · [Watch on YouTube](https://www.youtube.com/shorts/r_rXHZcoTGA)
+
+
+
+
+ Publish a resume link, add a password if needed and see views and downloads.
+
+
+
+ [Read the guide](/guides/sharing-your-resume-publicly) · [Watch on YouTube](https://www.youtube.com/shorts/zM0gvZJHd34)
+
+
+
+
+ Save a job posting, mark it as applied and keep the version of the resume you sent.
+
+
+
+ [Read the guide](/guides/tracking-job-applications) · [Watch on YouTube](https://www.youtube.com/shorts/TdbN-oSQ5Ks)
+
+
+
+
diff --git a/docs/research/reactive-resume-v6-launch-media-2026-10-02.md b/docs/research/reactive-resume-v6-launch-media-2026-10-02.md
new file mode 100644
index 000000000..5027af87d
--- /dev/null
+++ b/docs/research/reactive-resume-v6-launch-media-2026-10-02.md
@@ -0,0 +1,93 @@
+# Reactive Resume v6 launch media research
+
+Research date: 2026-10-02. Question: which media should accompany a founder's organic launch announcement on LinkedIn, X, and Show HN?
+
+Recommended launch package: **single product image or short PDF document carousel on LinkedIn; product image on the first X post and native demo video as a follow-up; working app/demo link on Show HN, with optional media on the destination.** These are editorial recommendations informed by the evidence, not guaranteed reach rankings. Most observations are from 2025 or early 2026.
+
+## LinkedIn: evidence and recommendation
+
+**For a personal founder account, a strong product image or document carousel is the better supported reach default. Native video remains useful for demonstrating the product; there is no reliable evidence here that GIFs win reach.** This is a judgment from the studies below, not a guaranteed algorithm rule.
+
+### Metricool: personal profiles, with actual impression data
+
+Released April 14, 2026; 673,658 posts from 63,108 accounts worldwide, comparing January–February 2025 with January–February 2026. First edition including both personal profiles and company pages. [Metricool release and sample](https://metricool.com/press-release-linkedin-study-2026/).
+
+The personal-profile table on printed page 28 gives these **averages per post**, visually checked against the PDF chart:
+
+| Format | Impressions | Interactions | Engagement rate |
+| ----------------- | ----------: | -----------: | --------------: |
+| Document carousel | 1,451.19 | 20.86 | 1.44% |
+| Single image | 1,186.74 | 21.51 | 1.81% |
+| Text | 1,045.15 | 12.20 | 1.06% |
+| Poll | 717.71 | 2.82 | 0.39% |
+| Video | 605.57 | 10.87 | 1.80% |
+| Multi-image | 338.42 | 12.56 | 3.71% |
+
+Carousel/image impressions were approximately 2.40×/1.96× video. Multi-image's highest engagement rate coincided with the lowest impressions: engagement does not equal distribution. Impressions count displays, including repeats. Outliers stayed in; zero-impression/zero-interaction posts were excluded. Personal-profile engagement excludes clicks. Means do not isolate format from audience, content, or creator differences. The methodology does not clearly document exclusion of all promoted content. [Metricool study, pp. 28 and 41](https://metricool.com/wp-content/uploads/Linkedin-Study-2026-EN.pdf).
+
+Personal analytics are restricted to posts published through Metricool, creating selection bias. [Metricool analytics scope](https://help.metricool.com/linkedin-personal-profile-metrics-h3usk).
+
+### Buffer: engagement evidence, not a LinkedIn reach comparison
+
+March 2026 report, 52M+ Buffer posts; latest data December 3, 2025. LinkedIn median engagement: carousel **21.77%**, video **7.35%**, image **6.52%**. No LinkedIn format reach table; video-for-reach is explicitly speculation. Profile/page split undisclosed; metrics differ from Metricool. [Buffer report](https://buffer.com/resources/state-of-social-media-engagement-2026/). Companion methodology inconsistently specifies followers as denominator. [Companion page](https://buffer.com/social-media-benchmarks/state-of-social-media-engagement-2026).
+
+### Socialinsider: company pages only
+
+Published March 16, 2026, with quarterly updates. Sample: **1.3M posts, 16,645 business pages, January 2024–December 2025**. Main “2026” benchmarks are actually 2025 observations; Q2 2026 engagement is a separate update.
+
+2025 average engagement by impressions: document **7.00%**, multi-image **6.45%**, video **6.00%**, image **5.30%**. Average impressions for pages with 1–5K followers: document **525**, multi-image **490**, video **355**, image **315**; 5–10K: **550 / 1,210 / 590 / 430** respectively. These support documents or images as plausible alternatives, but cannot establish founder-profile behavior. The prose says multi-image wins for all pages below 50K; its own 1–5K table instead puts documents first. Claimed 36% decline concerns video views, not every format's reach. [Socialinsider original benchmarks and methodology](https://www.socialinsider.io/social-media-benchmarks/linkedin).
+
+### AuthoredUp: corroborating profile data, with weaker methodological disclosure
+
+Updated September 2, 2026; **3M+ personal-profile posts, March 2025–February 2026**. Reported reach multipliers relative to each profile's median: document **1.39×**, image **1.20×**, video **0.86×**; engagement multipliers **1.30× / 1.33× / 0.93×**. Images lead below 5K followers; documents lead at 20K–50K and 50K+. This makes a single image especially reasonable for a smaller founder audience.
+
+Caveats: no account count, uncertainty intervals, fully reproducible aggregation method, or clear reach-field definition. Some prose contradicts tables: polls have higher reach than documents; image engagement multiplier exceeds document. Use reported tables as corroboration, not its universal algorithm explanations. [AuthoredUp format analysis](https://authoredup.com/blog/best-performing-content-on-linkedin).
+
+The **36,946-video** duration subset reports >3-minute videos at **1.21×** typical video reach, versus 30–60 seconds at **0.95×**. However, its video guide dates the sample March 2025–February 2026, while its format article dates it October 2025–March 2026. This is insufficient justification to lengthen a launch trailer. Length also covaries with topic and creator. [AuthoredUp video analysis](https://authoredup.com/blog/linkedin-video-posts), [conflicting sample window](https://authoredup.com/blog/best-performing-content-on-linkedin).
+
+### What official LinkedIn guidance establishes
+
+LinkedIn reported **36% year-over-year growth in video watching** in February 2025. Platform-wide growth does not establish greater reach per launch post. [LinkedIn product announcement](https://www.linkedin.com/pulse/up-36-over-last-year-video-linkedin-booming-time-now-somasundaram-yqbzc/).
+
+Its March 12, 2026 engineering article describes ranking using professional relevance and historical reading, skips, dwell, likes, comments, and shares. It does not publish a universal media-format multiplier. [LinkedIn feed engineering](https://www.linkedin.com/blog/engineering/feed/engineering-the-next-generation-of-linkedins-feed).
+
+GIF uploads are supported, but none of the studies above isolates GIF performance. Support is not evidence of superior reach. [LinkedIn supported media](https://www.linkedin.com/help/linkedin/answer/a564109).
+
+### Practical LinkedIn choice for this launch
+
+- **Main anniversary post:** use a sharp image showing the actual v6 editor and finished resume. If a carousel is easy to reuse, make a short PDF with a launch cover, editor, templates, and two or three substantial features. Keep the personal six-year story in the caption. Single image is the simplest defensible option; carousel helps readers explore multiple changes.
+- **Follow-up demonstration:** upload the existing showreel natively, with a readable cover, captions/on-screen explanation, and useful product action immediately. A suggested 30–60-second cut is an editorial choice for this launch, not a proven LinkedIn optimum. Do not pad it to match a duration benchmark.
+- **GIF:** use only if one brief loop explains a feature more clearly. No evidence warrants choosing it for a reach boost.
+- **Measure:** impressions/reach, outbound visits, and new signups. Engagement and video views are supporting metrics. A sequential launch and follow-up cannot isolate format effects because timing and audience fatigue differ.
+
+All quantitative format studies here are observational. They describe their own user samples and dates; none randomly assigns the same Reactive Resume post to video, GIF, and image.
+
+## X: evidence and recommendation
+
+Buffer's March 5, 2026 report gives median engagement rates of **3.56% text, 3.40% images, 2.96% video, 2.25% links**. Its primary windows cover 2025, with latest observations through December 3. These are Buffer users' posts and engagement rates, not format-specific reach rankings. The evidence supports images as an engagement default, without proving greater distribution. [Original Buffer report](https://buffer.com/resources/state-of-social-media-engagement-2026/).
+
+Metricool's 2026 cross-platform study covers **1,123,528 X posts from 15,116 accounts** in 2025. Video average interactions rose from **81.15 to 110.01**. Its X section does not supply a comparable video/image/GIF impression table. Absolute interaction averages cannot settle the reach question or contradict a median engagement-rate comparison by themselves. [Metricool report, pp. 4 and 58–59](https://metricool.com/wp-content/uploads/Social-Media-Study-2026-EN.pdf).
+
+An older official X Business article reports **55% more engagements for GIF posts versus posts without GIFs**, from an internal study of 3.7M users. It uses 2019 examples, lacks a study window and detailed methodology, and does not compare GIFs against images or videos or measure reach. Treat it as historical marketing evidence, not a 2026 format ranking. [Original X Business article](https://business.x.com/de/blog/6-ways-gifs-twitter-strategy).
+
+Official X Help says native videos and GIFs both autoplay, subject to viewers' settings; autoplay is not a GIF-only advantage. [X Help](https://help.x.com/en/using-x/x-videos).
+
+**Practical choice:** attach a readable screenshot or product launch image to the first post. Use a native MP4 demonstration in a follow-up or thread reply. A 15–30-second cut, showing a useful action immediately and understandable without sound, is an editorial suggestion, not a proven optimal duration. GIF is reasonable for one short repeating action; no current primary comparison found establishes it as the reach winner.
+
+## Show HN: product access matters more than attachment format
+
+The standard Show HN listing displays titles and links, without native image/video/GIF feed attachments. This is a direct observation of the current first-party interface, not an engagement study. A thumbnail on the destination does not create a thumbnail in this list. [Current Show HN listing](https://news.ycombinator.com/show).
+
+Show HN's official guidance prioritizes something readers can actually try, preferably without signup/email barriers, and rejects landing-page-only submissions. Major overhauls can qualify; small version updates generally do not. [Show HN guidelines](https://news.ycombinator.com/showhn.html).
+
+**Practical choice:** submit the working app or accessible demo. Show a clear screenshot and optional short demo video on that destination. Keep the real product easy to reach. No credible controlled media-format reach comparison found for Show HN.
+
+If the submission links directly to a video, HN asks for **[video]** in the title. Current general guidelines also prohibit generated or AI-edited submissions/comments, so the previous AI-written HN draft should be treated as planning notes; the author should write the final HN text themselves. [HN guidelines](https://news.ycombinator.com/newsguidelines.html).
+
+## Creative and measurement choices for this launch
+
+- Make the static asset useful by itself: readable v6 editor and finished resume, product name/version, and a short free/open-source message. These are creative recommendations, not measured guarantees.
+- For LinkedIn, distinguish a PDF document carousel from a post containing several separate images; the studies report materially different impression results.
+- If using video, upload the file natively on LinkedIn/X, add a cover and captions/on-screen text, and start with the product's useful behavior. Do not require watching a long intro before seeing the app. LinkedIn supports custom thumbnails and captions. [LinkedIn video help](https://www.linkedin.com/help/linkedin/answer/a7174587).
+- Compare post impressions, visits to the app, and useful downstream actions such as starting/exporting a resume. Do not treat autoplay video views as equivalent to visitors or unique people reached.
+- An image announcement followed by a video demo is a distribution plan, not an A/B experiment: content, time, exposure, and audience differ.
diff --git a/packages/pdf/vitest.config.ts b/packages/pdf/vitest.config.ts
index f31cc694a..0c702050e 100644
--- a/packages/pdf/vitest.config.ts
+++ b/packages/pdf/vitest.config.ts
@@ -10,7 +10,7 @@ const config = createVitestProjectConfig({
export default {
...config,
// Rendering and rasterizing real PDFs is far slower than Vitest's 5s default: the all-template
- // date characterization renders 15 templates in one test, and the picture-fit override case
+ // date characterization renders every template in one test, and the picture-fit override case
// rasterizes twice. Both land within a second or two of the default on a CI runner.
test: { ...config.test, testTimeout: 30_000 },
oxc: { jsx: { runtime: "automatic" as const } },