GSAP for React
greensock/gsap-skills
Shows how to run GSAP animations in React and Next.js with the useGSAP hook, refs, scoped selectors and automatic cleanup on unmount.
Guides implementing animated page and state transitions in React with the native View Transition API, covering shared elements, list reorders and directional navigation.
$ npx skills add vercel-labs/next-beats --skill vercel-react-view-transitions -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install vercel-labs/next-beats vercel-react-view-transitions --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/vercel-labs/next-beats.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/vercel-react-view-transitions .claude/skills/vercel-react-view-transitions && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "vercel-react-view-transitions" agent skill from https://github.com/vercel-labs/next-beats/tree/main/.agents/skills/vercel-react-view-transitions into .claude/skills/vercel-react-view-transitions/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vercel-react-view-transitions", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/vercel-labs/next-beats/tree/main/.agents/skills/vercel-react-view-transitionsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add vercel-labs/next-beats --skill vercel-react-view-transitions -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install vercel-labs/next-beats vercel-react-view-transitions --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vercel-labs/next-beats.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/vercel-react-view-transitions .agents/skills/vercel-react-view-transitions && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "vercel-react-view-transitions" agent skill from https://github.com/vercel-labs/next-beats/tree/main/.agents/skills/vercel-react-view-transitions into .agents/skills/vercel-react-view-transitions/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vercel-react-view-transitions", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add vercel-labs/next-beats --skill vercel-react-view-transitions -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install vercel-labs/next-beats vercel-react-view-transitions --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vercel-labs/next-beats.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/vercel-react-view-transitions .cursor/skills/vercel-react-view-transitions && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "vercel-react-view-transitions" agent skill from https://github.com/vercel-labs/next-beats/tree/main/.agents/skills/vercel-react-view-transitions into .cursor/skills/vercel-react-view-transitions/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vercel-react-view-transitions", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/vercel-labs/next-beats.git --path .agents/skills/vercel-react-view-transitions--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add vercel-labs/next-beats --skill vercel-react-view-transitions -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install vercel-labs/next-beats vercel-react-view-transitions --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vercel-labs/next-beats.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/vercel-react-view-transitions .gemini/skills/vercel-react-view-transitions && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "vercel-react-view-transitions" agent skill from https://github.com/vercel-labs/next-beats/tree/main/.agents/skills/vercel-react-view-transitions into .gemini/skills/vercel-react-view-transitions/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vercel-react-view-transitions", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install vercel-labs/next-beats vercel-react-view-transitionsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add vercel-labs/next-beats --skill vercel-react-view-transitions -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/vercel-labs/next-beats.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/vercel-react-view-transitions .github/skills/vercel-react-view-transitions && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "vercel-react-view-transitions" agent skill from https://github.com/vercel-labs/next-beats/tree/main/.agents/skills/vercel-react-view-transitions into .github/skills/vercel-react-view-transitions/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vercel-react-view-transitions", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add vercel-labs/next-beats --skill vercel-react-view-transitions -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install vercel-labs/next-beats vercel-react-view-transitions --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vercel-labs/next-beats.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/vercel-react-view-transitions .opencode/skills/vercel-react-view-transitions && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "vercel-react-view-transitions" agent skill from https://github.com/vercel-labs/next-beats/tree/main/.agents/skills/vercel-react-view-transitions into .opencode/skills/vercel-react-view-transitions/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "vercel-react-view-transitions", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
vercel-react-view-transitionsGuides implementing animated page and state transitions in React with the native View Transition API, covering shared elements, list reorders and directional navigation.
The skill lists five patterns in priority order and says to implement every one that fits the app rather than picking just one: a shared element named transition for going deeper into the same thing, a Suspense reveal for data that just loaded, per-item keys for list identity when items reorder, enter and exit props for things appearing or disappearing, and a route-level transition for moving to a new place. Directional slides are reserved for hierarchical navigation and ordered sequences like a carousel, since lateral tab-to-tab navigation has no depth to communicate and should use a plain fade or no animation instead.
On availability, Next.js App Router already bundles the React canary build so ViewTransition works without installing react@canary, even though npm ls react may show a stable-looking version; outside Next.js, react@canary and react-dom@canary must be installed because ViewTransition is not in stable React yet. Browser support is Chromium 125 and newer, Firefox 144 and newer, and Safari 18.2 and newer, with graceful degradation elsewhere, and five reference files cover CSS recipes, implementation details, Next.js specifics, general patterns and troubleshooting.
Read from SKILL.md and the folder at commit 5a85068. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
React View Transitions Guide loads about 3.1k tokens when it runs, and up to ~11k if it reads all its reference files. Until then it costs about 174 tokens; SKILL.md has 1,074 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from vercel-labs/next-beats at commit 5a85068, republished under its MIT licence (© vercel-labs). 1,074 words, ~3,112 tokens.
.claude/skills/vercel-react-view-transitions/SKILL.md (or your agent's skills folder). This skill also uses 7 other files; get the full folder from GitHub.Animate between UI states using the browser's native document.startViewTransition. Declare what with <ViewTransition>, trigger when with startTransition / useDeferredValue / Suspense, control how with CSS classes. Unsupported browsers skip animations gracefully.
Every <ViewTransition> should communicate a spatial relationship or continuity. If you can't articulate what it communicates, don't add it.
Implement all applicable patterns from this list, in this order:
| Priority | Pattern | What it communicates |
|---|---|---|
| 1 | Shared element (name) | "Same thing — going deeper" |
| 2 | Suspense reveal | "Data loaded" |
| 3 | List identity (per-item key) | "Same items, new arrangement" |
| 4 | State change (enter/exit) | "Something appeared/disappeared" |
| 5 | Route change (layout-level) | "Going to a new place" |
This is an implementation order, not a "pick one" list. Implement every pattern that fits the app. Only skip a pattern if the app has no use case for it.
| Context | Animation | Why |
|---|---|---|
| Hierarchical navigation (list → detail) | Type-keyed nav-forward / nav-back | Communicates spatial depth |
| Lateral navigation (tab-to-tab) | Bare <ViewTransition> (fade) or default="none" | No depth to communicate |
| Suspense reveal | enter/exit string props | Content arriving |
| Revalidation / background refresh | default="none" | Silent — no animation needed |
Reserve directional slides for hierarchical navigation (list → detail) and ordered sequences (prev/next photo, carousel, paginated results). For ordered sequences, the direction communicates position: "next" slides from right, "previous" from left. Lateral/unordered navigation (tab-to-tab) should not use directional slides — it falsely implies spatial depth.
react@canary — the App Router already bundles React canary internally. ViewTransition works out of the box. npm ls react may show a stable-looking version; this is expected.react@canary react-dom@canary (ViewTransition is not in stable React).When adding view transitions to an existing app, follow references/implementation.md step by step. Start with the audit — do not skip it. Copy the CSS recipes from references/css-recipes.md into the global stylesheet — do not write your own animation CSS.
<ViewTransition> Componentimport { ViewTransition } from 'react';
<ViewTransition>
<Component />
</ViewTransition>React auto-assigns a unique view-transition-name and calls document.startViewTransition behind the scenes. Never call startViewTransition yourself.
| Trigger | When it fires |
|---|---|
| enter | <ViewTransition> first inserted during a Transition |
| exit | <ViewTransition> first removed during a Transition |
| update | DOM mutations inside a <ViewTransition>. With nested VTs, mutation applies to the innermost one |
| share | Named VT unmounts and another with same name mounts in the same Transition |
Only startTransition, useDeferredValue, or Suspense activate VTs. Regular setState does not animate.
<ViewTransition> only activates enter/exit if it appears before any DOM nodes:
// Works
<ViewTransition enter="auto" exit="auto">
<div>Content</div>
</ViewTransition>
// Broken — div wraps the VT, suppressing enter/exit
<div>
<ViewTransition enter="auto" exit="auto">
<div>Content</div>
</ViewTransition>
</div>Values: "auto" (browser cross-fade), "none" (disabled), "class-name" (custom CSS), or { [type]: value } for type-specific animations.
<ViewTransition default="none" enter="slide-in" exit="slide-out" share="morph" />If default is "none", all triggers are off unless explicitly listed.
::view-transition-old(.class) — outgoing snapshot::view-transition-new(.class) — incoming snapshot::view-transition-group(.class) — container::view-transition-image-pair(.class) — old + new pairSee references/css-recipes.md for ready-to-use animation recipes.
Tag transitions with addTransitionType so VTs can pick different animations based on context. Call it multiple times to stack types — different VTs in the tree react to different types:
startTransition(() => {
addTransitionType('nav-forward');
addTransitionType('select-item');
router.push('/detail/1');
});Pass an object to map types to CSS classes. Works on enter, exit, and share:
<ViewTransition
enter={{ 'nav-forward': 'slide-from-right', 'nav-back': 'slide-from-left', default: 'none' }}
exit={{ 'nav-forward': 'slide-to-left', 'nav-back': 'slide-to-right', default: 'none' }}
share={{ 'nav-forward': 'morph-forward', 'nav-back': 'morph-back', default: 'morph' }}
default="none"
>
<Page />
</ViewTransition>enter and exit don't have to be symmetric. For example, fade in but slide out directionally:
<ViewTransition
enter={{ 'nav-forward': 'fade-in', 'nav-back': 'fade-in', default: 'none' }}
exit={{ 'nav-forward': 'nav-forward', 'nav-back': 'nav-back', default: 'none' }}
default="none"
>TypeScript: ViewTransitionClassPerType requires a default key in the object.
For apps with multiple pages, extract the type-keyed VT into a reusable wrapper:
export function DirectionalTransition({ children }: { children: React.ReactNode }) {
return (
<ViewTransition
enter={{ 'nav-forward': 'nav-forward', 'nav-back': 'nav-back', default: 'none' }}
exit={{ 'nav-forward': 'nav-forward', 'nav-back': 'nav-back', default: 'none' }}
default="none"
>
{children}
</ViewTransition>
);
}router.back() and Browser Back Buttonrouter.back() and the browser's back/forward buttons do not trigger view transitions (popstate is synchronous, incompatible with startViewTransition). Use router.push() with an explicit URL instead.
Types are available during navigation but not during subsequent Suspense reveals (separate transitions, no type). Use type maps for page-level enter/exit; use simple string props for Suspense reveals.
Same name on two VTs — one unmounting, one mounting — creates a shared element morph:
<ViewTransition name="hero-image">
<img src="/thumb.jpg" onClick={() => startTransition(() => onSelect())} />
</ViewTransition>
// On the other view — same name
<ViewTransition name="hero-image">
<img src="/full.jpg" />
</ViewTransition>name can be mounted at a time — use unique names (photo-${id}). Watch for reusable components: if a component with a named VT is rendered in both a modal/popover and a page, both mount simultaneously and break the morph. Either make the name conditional (via a prop) or move the named VT out of the shared component into the specific consumer.share takes precedence over enter/exit. Think through each navigation path: when no matching pair forms (e.g., the target page doesn't have the same name), enter/exit fires instead. Consider whether the element needs a fallback animation for those paths.{show && (
<ViewTransition enter="fade-in" exit="fade-out"><Panel /></ViewTransition>
)}{items.map(item => (
<ViewTransition key={item.id}><ItemCard item={item} /></ViewTransition>
))}Trigger inside startTransition. Avoid wrapper <div>s between list and VT.
Shared elements and list identity are independent concerns — don't confuse one for the other. When a list item contains a shared element (e.g., an image that morphs into a detail view), use two nested <ViewTransition> boundaries:
{items.map(item => (
<ViewTransition key={item.id}> {/* list identity */}
<Link href={`/items/${item.id}`}>
<ViewTransition name={`item-image-${item.id}`} share="morph"> {/* shared element */}
<Image src={item.image} />
</ViewTransition>
<p>{item.name}</p>
</Link>
</ViewTransition>
))}The outer VT handles list reorder/enter animations. The inner VT handles the cross-route shared element morph. Missing either layer means that animation silently doesn't happen.
key<ViewTransition key={searchParams.toString()} enter="slide-up" default="none">
<ResultsGrid />
</ViewTransition>Caution: If wrapping <Suspense>, changing key remounts the boundary and refetches.
Simple cross-fade:
<ViewTransition>
<Suspense fallback={<Skeleton />}><Content /></Suspense>
</ViewTransition>Directional reveal:
<Suspense fallback={<ViewTransition exit="slide-down"><Skeleton /></ViewTransition>}>
<ViewTransition enter="slide-up" default="none"><Content /></ViewTransition>
</Suspense>For more patterns, see references/patterns.md.
Every VT matching the trigger fires simultaneously in a single document.startViewTransition. VTs in different transitions (navigation vs later Suspense resolve) don't compete.
default="none" LiberallyWithout it, every VT fires the browser cross-fade on every transition — Suspense resolves, useDeferredValue updates, background revalidations. Always use default="none" and explicitly enable only desired triggers.
Pattern A — Directional slides: Type-keyed VT on each page, fires during navigation. Pattern B — Suspense reveals: Simple string props, fires when data loads (no type).
They coexist because they fire at different moments. default="none" on both prevents cross-interference. Always pair enter with exit. Place directional VTs in page components, not layouts.
When a parent VT exits, nested VTs inside it do not fire their own enter/exit — only the outermost VT animates. Per-item staggered animations during page navigation are not possible today. See react#36135 for an experimental opt-in fix.
For Next.js setup (experimental.viewTransition flag, transitionTypes prop on next/link, App Router patterns, Server Components), see references/nextjs.md.
Always add the reduced motion CSS from references/css-recipes.md to your global stylesheet.
references/implementation.md — Step-by-step implementation workflow.references/patterns.md — Patterns, animation timing, events API, troubleshooting.references/css-recipes.md — Ready-to-use CSS animation recipes.references/nextjs.md — Next.js App Router patterns and Server Component details.For the complete guide with all reference files expanded: AGENTS.md
© vercel-labs, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 7 other files (references) in .agents/skills/vercel-react-view-transitions of vercel-labs/next-beats.
Open the folder on GitHubat commit 5a85068
We found 14 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 10 other GitHub owners. This page covers the copy in vercel-labs/next-beats, which our catalogue first saw on October 7, 2026.
React View Transitions Guide next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| React View Transitions Guide this skillvercel-labs/next-beats | 167 | 10 repos | ~3.1k | Automated safety check: Pass | MIT | |
| GSAP for Reactgreensock/gsap-skills | 16k | 4 repos | ~1.6k | Automated safety check: Pass | MIT | |
| Animatedelphi-ai/animate-skill | 108 | — | ~1.3k | Automated safety check: Pass | None | |
| Awwwards-Level React AnimationsHainrixz/editor-pro-max | 261 | — | ~4.4k | Automated safety check: Pass | Custom licence | |
| Chakra UI v3 Builderchakra-ui/chakra-ui | 41k | — | ~3.1k | Automated safety check: Pass | MIT | |
| Website ClonerJCodesMore/ai-website-cloner-template | 36k | — | ~1.7k | Automated safety check: Pass | MIT |
greensock/gsap-skills
Shows how to run GSAP animations in React and Next.js with the useGSAP hook, refs, scoped selectors and automatic cleanup on unmount.
delphi-ai/animate-skill
Animation patterns and best practices for Next.js/React applications.
Hainrixz/editor-pro-max
Guides React animation work with GSAP, Motion, Anime.js and Lenis for scroll effects, page transitions, text effects and generative visuals, with a library decision table.
chakra-ui/chakra-ui
Builds responsive, accessible Chakra UI v3 components and layouts, sets up Chakra in new or existing projects, and designs themes with tokens, semantic tokens and recipes.
JCodesMore/ai-website-cloner-template
Rebuilds existing web pages as editable local code that matches their content, assets, responsive layout and interactions, including Framer sites and animated pages.
sanity-io/sanity
React and Next.js performance optimization guidelines from Vercel Engineering.
Categories
Guides implementing animated page and state transitions in React with the native View Transition API, covering shared elements, list reorders and directional navigation. The skill lists five patterns in priority order and says to implement every one that fits the app rather than picking just one: a shared element named transition for going deeper into the same thing, a Suspense reveal for data that just loaded, per-item keys for list identity when items reorder, enter and exit props for things appearing or disappearing, and a route-level transition for moving to a new place. Directional slides are reserved for hierarchical navigation and ordered sequences like a carousel, since lateral tab-to-tab navigation has no depth to communicate and should use a plain fade or no animation instead.
React View Transitions Guide fits situations like: adding animated route transitions to a Next.js or React app; animating a shared element between a list and its detail view; animating list items as they reorder, or components as they enter and exit.
Run `npx skills add vercel-labs/next-beats --skill vercel-react-view-transitions -a claude-code`. Or copy the skill folder (.agents/skills/vercel-react-view-transitions in vercel-labs/next-beats) into .claude/skills/vercel-react-view-transitions in your project. Claude Code loads it when a task matches its description.
Run `npx skills add vercel-labs/next-beats --skill vercel-react-view-transitions -a codex`. Or copy the skill folder (.agents/skills/vercel-react-view-transitions in vercel-labs/next-beats) into .agents/skills/vercel-react-view-transitions in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add vercel-labs/next-beats --skill vercel-react-view-transitions -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/vercel-react-view-transitions, .gemini/skills/vercel-react-view-transitions, .github/skills/vercel-react-view-transitions and .opencode/skills/vercel-react-view-transitions in your project.
Going by SKILL.md and its folder, React View Transitions Guide needs the command-line tools its instructions call (npm). Our summary lists: react@canary and react-dom@canary outside Next.js.
SKILL.md names 1 domain. As links in the text: github.com. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
React View Transitions Guide is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.1k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 7.4k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with React View Transitions Guide: GSAP for React (greensock/gsap-skills, 16k stars), Animate (delphi-ai/animate-skill, 108 stars), Awwwards-Level React Animations (Hainrixz/editor-pro-max, 261 stars) and Chakra UI v3 Builder (chakra-ui/chakra-ui, 41k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
vercel-labs (a GitHub organization, an official publisher) maintains it in vercel-labs/next-beats, which has 167 GitHub stars. The repository was last updated on September 29, 2026.
Source: vercel-labs/next-beats on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.