Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
259 commits
Select commit Hold shift + click to select a range
41af453
Version Packages (beta) (#1876)
github-actions[bot] Dec 10, 2025
08f0c81
chore(core): updated cli logger (#1877)
boyney123 Dec 10, 2025
2e5178f
Version Packages (beta) (#1878)
github-actions[bot] Dec 10, 2025
c43115d
feat(core): added channel support in nav and search (#1879)
boyney123 Dec 10, 2025
847ca85
Version Packages (beta) (#1880)
github-actions[bot] Dec 10, 2025
525c809
chore(core): updated react-syntax-highlighter (#1881)
boyney123 Dec 11, 2025
36fcd52
Version Packages (beta) (#1882)
github-actions[bot] Dec 11, 2025
713c535
chore(core): updated logger for the ecstudio watcher (#1884)
boyney123 Dec 11, 2025
2a32d7c
chore(core): added empty state to nested sidebar (#1886)
boyney123 Dec 11, 2025
2fb0452
Version Packages (beta) (#1885)
github-actions[bot] Dec 11, 2025
cc62813
fix(core): fixed issue embedding pages on build
boyney123 Dec 11, 2025
341279e
fix(core): fixed issue embedding pages on build (#1887)
boyney123 Dec 11, 2025
f1d79e1
Version Packages (beta) (#1888)
github-actions[bot] Dec 11, 2025
507d14d
fix(core): fixed deployment of example catalogs on releases (#1889)
boyney123 Dec 11, 2025
35aa815
Version Packages (beta) (#1890)
github-actions[bot] Dec 11, 2025
8db71c9
fix(core): fixed issue embedding pages on build (#1891)
boyney123 Dec 11, 2025
33f5da5
Version Packages (beta) (#1892)
github-actions[bot] Dec 11, 2025
c5592f1
fix(core): fixed issue embedding pages on build (#1893)
boyney123 Dec 11, 2025
13fe50f
Version Packages (beta) (#1894)
github-actions[bot] Dec 11, 2025
39fbd2f
feat(core): added support for titles on admonitions (#1895)
boyney123 Dec 11, 2025
dac4dc5
feat(core): updated homepage styles (#1897)
boyney123 Dec 11, 2025
d829b7b
Version Packages (beta) (#1898)
github-actions[bot] Dec 11, 2025
8ed1960
chore(core): removed unused icons on domain grid (#1899)
boyney123 Dec 11, 2025
35a7fae
Version Packages (beta) (#1900)
github-actions[bot] Dec 11, 2025
b8730a9
fix(core): mdx pages are added to teams and users (#1901)
boyney123 Dec 11, 2025
0bc73d3
chore(core): auth is now more explict opt in (#1902)
boyney123 Dec 11, 2025
6c91497
Version Packages (beta) (#1903)
github-actions[bot] Dec 11, 2025
57d1496
chore(core): auth is now more explict opt in (#1904)
boyney123 Dec 11, 2025
c270a98
fix(core): problems with asyncapi loading in the DOM (#1906)
boyney123 Dec 11, 2025
beb2ca0
Version Packages (beta) (#1905)
github-actions[bot] Dec 11, 2025
5b4095e
fix(core): fixed accessibility issues (#1907)
boyney123 Dec 11, 2025
fd5bd40
Version Packages (beta) (#1908)
github-actions[bot] Dec 11, 2025
786db2d
chore(core): added icons to spec files in sidebar (#1909)
boyney123 Dec 12, 2025
6e7d952
Version Packages (beta) (#1910)
github-actions[bot] Dec 12, 2025
c0372e5
feat(core): embedding visualizer can be embedded with animations (#1911)
boyney123 Dec 12, 2025
99d762b
Version Packages (beta) (#1912)
github-actions[bot] Dec 12, 2025
a365ad5
chore(core): added release automation for SaaS example
boyney123 Dec 12, 2025
1cc63fa
chore(core): added v3 beta message update (#1913)
boyney123 Dec 12, 2025
703a6bf
Version Packages (beta) (#1914)
github-actions[bot] Dec 12, 2025
21e7c2f
update readme
boyney123 Dec 12, 2025
7b1311b
chore(core): updated packages (#1916)
boyney123 Dec 12, 2025
de19451
feat(core): simplified eventcatalog chat (#1919)
boyney123 Dec 15, 2025
105f1bd
Version Packages (beta) (#1918)
github-actions[bot] Dec 15, 2025
9ec4525
chore(core): refactored features into astro custom integrations (#1920)
boyney123 Dec 15, 2025
38d23d2
Version Packages (beta) (#1921)
github-actions[bot] Dec 15, 2025
1a0bc7d
chore(core): removed some redundant files (#1922)
boyney123 Dec 15, 2025
e7c562f
Version Packages (beta) (#1923)
github-actions[bot] Dec 15, 2025
fcd3e9c
chore(core): removed some redundant files (#1924)
boyney123 Dec 15, 2025
997e051
Version Packages (beta) (#1925)
github-actions[bot] Dec 15, 2025
aff2f92
feat(core): added domain integration map and attachments to sidebar (…
boyney123 Dec 17, 2025
9c6b71b
Version Packages (beta) (#1932)
github-actions[bot] Dec 17, 2025
d1e0979
feat(core): updated chat features (#1934)
boyney123 Dec 21, 2025
f50c7bc
Version Packages (beta) (#1935)
github-actions[bot] Dec 21, 2025
f7ef380
feat(fix): fixed search throughout the application (#1938)
boyney123 Dec 22, 2025
7612064
Version Packages (beta) (#1939)
github-actions[bot] Dec 22, 2025
cd713b8
feat(core): updated default homepage (#1940)
boyney123 Dec 23, 2025
4a17954
chore(core): updated sidebar styles (#1941)
boyney123 Dec 23, 2025
17c1abc
chore(core): updated tables styles (#1943)
boyney123 Dec 23, 2025
80399f5
chore(core): updated ubi lang styles (#1944)
boyney123 Dec 24, 2025
5a7f45b
chore(core): updated the schema explorer UI (#1945)
boyney123 Dec 24, 2025
5525414
chore(core): removed md to mdx checks (#1946)
boyney123 Dec 24, 2025
ffc2ce9
Version Packages (beta) (#1942)
github-actions[bot] Dec 24, 2025
f49aade
feat(core): updated architecture overview pages (#1948)
boyney123 Jan 5, 2026
266dd72
Version Packages (beta) (#1949)
github-actions[bot] Jan 5, 2026
dfce0b7
chore(core): llms-txt is now enabled by default (#1951)
boyney123 Jan 6, 2026
b4a7aae
Version Packages (beta) (#1952)
github-actions[bot] Jan 6, 2026
bf6fe18
chore(core): release of v3 (#1953)
boyney123 Jan 7, 2026
3b8851a
Version Packages (#1954)
github-actions[bot] Jan 7, 2026
c518cf3
adding support for themes (#1955)
boyney123 Jan 7, 2026
8830807
Version Packages (#1956)
github-actions[bot] Jan 7, 2026
31c0bfe
feat(core): added ability to add custom tools to AI assistant (#1958)
boyney123 Jan 8, 2026
6f1a337
Version Packages (#1959)
github-actions[bot] Jan 8, 2026
c8e2c5c
feat(core): added support for icepanel diagrams (#1961)
boyney123 Jan 8, 2026
8d67bf4
Version Packages (#1962)
github-actions[bot] Jan 8, 2026
d1b2172
fix(core): changelog theme styles (#1963)
boyney123 Jan 8, 2026
7b92aaa
Version Packages (#1964)
github-actions[bot] Jan 8, 2026
a4645bf
feat(core): added new resource type diagrams (#1969)
boyney123 Jan 9, 2026
0ee2fd6
Version Packages (#1970)
github-actions[bot] Jan 9, 2026
1bd23c3
fix(core): fixed schema explorer in srr mode on start (#1971)
boyney123 Jan 9, 2026
7a360fb
Version Packages (#1972)
github-actions[bot] Jan 9, 2026
5162696
feat(core): add mcp server and shared catalog tools (#1977)
boyney123 Jan 12, 2026
de46d04
Version Packages (#1978)
github-actions[bot] Jan 12, 2026
c1a349f
feat(core): add interactive controls to mermaid and plantuml (#1979)
boyney123 Jan 12, 2026
1052ef1
Version Packages (#1980)
github-actions[bot] Jan 12, 2026
be85edd
fix(core): fixed useCallback hook placement before early returns (#1981)
boyney123 Jan 12, 2026
8599f78
update
boyney123 Jan 12, 2026
a220932
update
boyney123 Jan 12, 2026
d067e22
Version Packages (#1982)
github-actions[bot] Jan 12, 2026
9f215bf
update
boyney123 Jan 12, 2026
a8aaa21
update
boyney123 Jan 12, 2026
d3ce092
fix(search): respect base path and trailing slash config in search re…
boyney123 Jan 12, 2026
672bcd8
fix(sidebar): fix duplicate search results and add grouping by type (…
boyney123 Jan 12, 2026
bc32e0f
Version Packages (#1986)
github-actions[bot] Jan 12, 2026
afc2dc5
update discord release
boyney123 Jan 12, 2026
8bb6259
update discord release
boyney123 Jan 12, 2026
f813f1e
update discord release
boyney123 Jan 12, 2026
97812e5
update discord release
boyney123 Jan 12, 2026
3f592d0
update discord release
boyney123 Jan 12, 2026
ebe3602
update discord release
boyney123 Jan 12, 2026
e1a257a
update discord release
boyney123 Jan 12, 2026
65ac084
update discord release
boyney123 Jan 12, 2026
3177b34
Fix Avro and non-JSON schema file downloads in context menu (#1989)
boyney123 Jan 12, 2026
f307e46
Version Packages (#1990)
github-actions[bot] Jan 12, 2026
caaf899
fix(visualizer): correct edge direction when channel version not foun…
boyney123 Jan 13, 2026
5601228
Version Packages (#1993)
github-actions[bot] Jan 13, 2026
ac114f0
feat(discover): add enhanced table filtering and tabbed navigation (#…
boyney123 Jan 14, 2026
6d7dff5
fix(sidebar): reduce build size with node references and static json …
boyney123 Jan 14, 2026
469e796
Version Packages (#1997)
github-actions[bot] Jan 14, 2026
7f99905
feat(ci): add build size budget check (#1998)
boyney123 Jan 14, 2026
cbf9071
fix(sidebar): handle favorites removal for deleted nodes and add them…
boyney123 Jan 14, 2026
e6b54fb
feat(mdx): add inline resource references with hover tooltips (#2004)
boyney123 Jan 14, 2026
971adf4
chore(core): bumped hono version up (#2000)
boyney123 Jan 14, 2026
1d21a6c
Version Packages (#2002)
github-actions[bot] Jan 14, 2026
66d5769
fix(sidebar): default to teams page when no users defined (#2007)
boyney123 Jan 14, 2026
d4d09e8
fix(core): resolve type errors and add astro check script (#2008)
boyney123 Jan 14, 2026
d73882c
Version Packages (#2009)
github-actions[bot] Jan 14, 2026
4cbd86f
feat(domains): add sends and receives properties for domain-level mes…
boyney123 Jan 15, 2026
ac0008e
Version Packages (#2012)
github-actions[bot] Jan 15, 2026
141a126
updated astro (#2014)
boyney123 Jan 16, 2026
be0ba03
fix(schema-viewer): add support for oneOf and anyOf JSON Schema keywo…
boyney123 Jan 16, 2026
921e965
Version Packages (#2015)
github-actions[bot] Jan 16, 2026
d1bb4db
fix(domains): add specifications support to domain sidebar and schema…
boyney123 Jan 16, 2026
c9c408a
Version Packages (#2019)
github-actions[bot] Jan 16, 2026
05f0e2e
feat(core): add Data Products collection support (#2024)
boyney123 Jan 21, 2026
8f6435c
Version Packages (#2025)
github-actions[bot] Jan 21, 2026
732d7f6
fix(sidebar): resolve typescript type errors in data product builder …
boyney123 Jan 21, 2026
0cd8d7d
Version Packages (#2027)
github-actions[bot] Jan 26, 2026
dcdebdc
fix(core): fixed issue with custom docs (#2033)
boyney123 Jan 26, 2026
5c6e27c
Version Packages (#2034)
github-actions[bot] Jan 26, 2026
0c69558
feat(nodegraph): add mermaid export and view mode switching (#2036)
boyney123 Jan 26, 2026
8f92272
fix(core): support nested directories in containers collection glob p…
boyney123 Jan 26, 2026
4a80f0b
Version Packages (#2037)
github-actions[bot] Jan 26, 2026
9d0042b
feat(mermaid): add configurable maxTextSize for larger diagrams (#2039)
boyney123 Jan 27, 2026
9819c35
Version Packages (#2040)
github-actions[bot] Jan 27, 2026
3c573c4
feat(analytics): add resource counting to build telemetry (#2041)
boyney123 Jan 27, 2026
2fe2aa8
Version Packages (#2042)
github-actions[bot] Jan 27, 2026
6dd86e3
chore(core): updated astro (#2045)
boyney123 Jan 28, 2026
caea0ec
chore(deps): update diff package to v8.0.3 (#2046)
boyney123 Jan 28, 2026
9e758f6
chore(deps): update hono from 4.11.4 to 4.11.7 (#2049)
boyney123 Jan 28, 2026
d3499fc
Version Packages (#2048)
github-actions[bot] Jan 28, 2026
18d3170
updates gitignore
boyney123 Jan 29, 2026
11963f0
fix(core): add config to disable api/catalog prerender for large cata…
boyney123 Jan 29, 2026
19cc99f
Version Packages (#2052)
github-actions[bot] Jan 29, 2026
11e34d4
Add visualizer layout persistence in dev mode (#2053)
boyney123 Jan 29, 2026
f4b53d5
Version Packages (#2054)
github-actions[bot] Jan 29, 2026
2c300de
fix(core): add transition:persist to prevent asset re-requests during…
boyney123 Jan 30, 2026
265ec79
feat(visualizer): add focus mode for exploring node connections (#2060)
boyney123 Jan 30, 2026
c18b9a4
Version Packages (#2058)
github-actions[bot] Jan 30, 2026
ff678ea
fix(mcp): support AI SDK tool() helper inputSchema property (#2068)
boyney123 Feb 4, 2026
f2255d9
feat(custom-docs): add clickable folder navigation with index file su…
boyney123 Feb 4, 2026
af8b756
Version Packages (#2069)
github-actions[bot] Feb 4, 2026
404ca30
fix(deps): downgrade react-syntax-highlighter to v15 for compatibilit…
boyney123 Feb 7, 2026
ebf73f1
Version Packages (#2081)
github-actions[bot] Feb 7, 2026
94f3b93
fix(core): resolve PlantUML rendering race condition with destroyZoom…
ZakaryaCH Feb 10, 2026
afe20db
add ZakaryaCH as a contributor for bug (#2083)
allcontributors[bot] Feb 10, 2026
31a0efe
chore(deps): update mcp sdk, diff2html, and jsonpath (#2085)
boyney123 Feb 10, 2026
4287f97
fix(deps): upgrade astro from 5.16.16 to 5.17.1 (#2086)
boyney123 Feb 10, 2026
080700f
Version Packages (#2084)
github-actions[bot] Feb 10, 2026
daab80f
fix(deps): upgrade axios from 1.7.7 to 1.13.5 (#2089)
boyney123 Feb 10, 2026
bc85255
fix(core): configure esbuild jsx automatic mode in vite optimizeDeps …
boyney123 Feb 10, 2026
b2c45d8
Version Packages (#2091)
github-actions[bot] Feb 10, 2026
6bd6369
chore(deps): remove unused dependencies (#2092)
boyney123 Feb 10, 2026
b3fa140
Version Packages (#2093)
github-actions[bot] Feb 10, 2026
c8c2330
fix(core): verify required config fields before copying core to preve…
boyney123 Feb 10, 2026
1780579
Version Packages (#2096)
github-actions[bot] Feb 10, 2026
1c4f773
Remove 'max-h-content' class from content (#2094)
jboeijenga Feb 10, 2026
fe8b1ab
add jboeijenga as a contributor for code (#2097)
allcontributors[bot] Feb 10, 2026
b63eb1a
Migrate EventCatalog to Turborepo Monorepo Structure (#2099)
boyney123 Feb 10, 2026
ba7c7c1
fix: correct image path in README
boyney123 Feb 10, 2026
635a643
Version Packages (beta) (#2098)
github-actions[bot] Feb 10, 2026
a7323f5
fix(ci): update Discord notification script path for monorepo
boyney123 Feb 10, 2026
19696f3
Migrate SDK and create-eventcatalog packages into monorepo (#2100)
boyney123 Feb 10, 2026
cfd8c2d
docs: update CLAUDE.md for monorepo structure
boyney123 Feb 10, 2026
3b14919
fix(ci): update changesets action to v1 and remove invalid parameter
boyney123 Feb 10, 2026
f5732ac
fix(ci): remove NPM_TOKEN (using OpenID Connect instead)
boyney123 Feb 10, 2026
89032af
Version Packages (beta) (#2101)
github-actions[bot] Feb 10, 2026
b72bf35
chore: remove root dockerignore file
boyney123 Feb 10, 2026
6f3e03f
Migrate EventCatalog Linter to Monorepo (#2107)
boyney123 Feb 10, 2026
8e23329
Version Packages (#2108)
github-actions[bot] Feb 10, 2026
b02858f
fix: use workspace dependency for @eventcatalog/linter
boyney123 Feb 10, 2026
0b35904
Extract CLI into @eventcatalog/cli package (#2109)
boyney123 Feb 10, 2026
4282788
Version Packages (#2110)
github-actions[bot] Feb 10, 2026
b466daf
fix(ci): add build step to release workflow before publish (#2113)
boyney123 Feb 11, 2026
cdd5db0
Version Packages (#2114)
github-actions[bot] Feb 11, 2026
c05874a
feat: extract visualiser into standalone package (#2112)
boyney123 Feb 11, 2026
7ea8e71
Version Packages (beta) (#2115)
github-actions[bot] Feb 11, 2026
4caca36
chore: link core, sdk, and visualiser in changesets (#2116)
boyney123 Feb 11, 2026
2b8de40
fix(visualiser): add repository url to package.json for npm provenance
boyney123 Feb 11, 2026
579c9e2
Fix visualiser node icon spacing in full mode (#2117)
boyney123 Feb 11, 2026
39570a0
Version Packages (beta) (#2118)
github-actions[bot] Feb 12, 2026
d693bf6
refactor(core): remove catalog object from collection getters (#2120)
boyney123 Feb 12, 2026
de999c8
Refactor collection getters + reverse index for producer/consumer res…
boyney123 Feb 12, 2026
7d0203c
fix(visualiser): resolve header visibility conflict with tailwind uti…
boyney123 Feb 12, 2026
dfa2a02
Version Packages (beta) (#2124)
github-actions[bot] Feb 12, 2026
3dc6938
Exit beta pre-release mode (#2126)
boyney123 Feb 12, 2026
2aee83a
Version Packages (#2127)
github-actions[bot] Feb 12, 2026
add9f04
fix(core): pass auth headers when resolving AsyncAPI remote refs (#2132)
thorthelegend99 Feb 15, 2026
487021a
fix(core): resolve RemoteSchema env placeholders in SSR (#2133)
thorthelegend99 Feb 15, 2026
c178b75
Setup Language Server and DSL Playground Packages for Beta Release (#…
boyney123 Feb 15, 2026
ee78feb
added build command to playground
boyney123 Feb 15, 2026
c627d27
perf(ui): defer search/sidebar hydration on initial page load (#2140)
thorthelegend99 Feb 16, 2026
f8a3a3f
perf(search): load index on intent via lightweight API (#2142)
thorthelegend99 Feb 16, 2026
9c963d1
perf(search): compact API payload for search index (#2147)
thorthelegend99 Feb 16, 2026
5db0ed9
fix(core): resolve astro check type errors (#2148)
boyney123 Feb 16, 2026
f9e783d
added preview command
boyney123 Feb 16, 2026
dc33dad
added preview command
boyney123 Feb 16, 2026
419d35c
fix(core): exclude dist directories from content collection glob patt…
boyney123 Feb 16, 2026
1dc170a
fix(ui): prevent theme toggle hydration mismatch (#2150)
thorthelegend99 Feb 16, 2026
45a56e2
feat(core): gate /api/catalog route via integration (#2149)
thorthelegend99 Feb 16, 2026
ef720e6
perf(core): lazy-load heavy graph and OpenAPI viewers (#2143)
thorthelegend99 Feb 16, 2026
be461d1
perf(visualiser): gate static route generation when disabled (#2144)
thorthelegend99 Feb 16, 2026
e17a81c
perf(dev): prewarm first request after startup (#2153)
thorthelegend99 Feb 16, 2026
28fe2d5
fix(visualiser): make focus mode modal styling self-contained (#2151)
thorthelegend99 Feb 16, 2026
47b0bd0
updated asto versions (#2154)
boyney123 Feb 16, 2026
b10a0ed
fixing build
boyney123 Feb 16, 2026
5c19c6d
fixing build
boyney123 Feb 16, 2026
dbafdf2
Version Packages (#2134)
github-actions[bot] Feb 16, 2026
35713cc
fix(core): remove negated glob patterns from content.config.ts (#2156)
boyney123 Feb 16, 2026
2e1bc9a
Version Packages (#2157)
github-actions[bot] Feb 16, 2026
c782129
feat(cli): add export command for DSL (.ec) format (#2160)
boyney123 Feb 16, 2026
788c106
fixing build
boyney123 Feb 16, 2026
dc2adb9
Version Packages (#2161)
github-actions[bot] Feb 16, 2026
69cb966
Add in-memory file index cache to SDK for faster catalog lookups (#2162)
boyney123 Feb 16, 2026
5df155d
Version Packages (#2163)
github-actions[bot] Feb 16, 2026
ca5c1d8
fix(language-server): remove redundant message-to-channel routes-to e…
boyney123 Feb 17, 2026
147afed
Version Packages (#2169)
github-actions[bot] Feb 17, 2026
2bfaf62
fix(core): avoid first-run dev restart from config temp copy (#2172)
thorthelegend99 Feb 17, 2026
3a6bc02
Version Packages (#2173)
github-actions[bot] Feb 18, 2026
f535216
fix(core): extract isSameVersion to client-safe module to prevent nod…
boyney123 Feb 18, 2026
f201171
test(core): add tests for version-compare module (#2176)
boyney123 Feb 18, 2026
d703923
feat(cli): add import command and replace base64 logo with png asset …
boyney123 Feb 18, 2026
cb52e45
Version Packages (#2175)
github-actions[bot] Feb 18, 2026
9fe5b5f
fix(asyncapi): isolate asyncapi code block styles in dark mode (#2180)
boyney123 Feb 18, 2026
2182953
Version Packages (#2181)
github-actions[bot] Feb 18, 2026
d4e2744
fixing build
boyney123 Feb 18, 2026
7179a7a
feat(core): add resource docs feature for attaching documentation to …
boyney123 Feb 19, 2026
e18698c
Version Packages (beta) (#2186)
github-actions[bot] Feb 19, 2026
669a526
fixing discord notification
boyney123 Feb 19, 2026
350d1e0
fix(core): reduce astro build log noise (#2187)
boyney123 Feb 19, 2026
d60f7ec
Version Packages (beta) (#2188)
github-actions[bot] Feb 19, 2026
8554752
chore: remove beta pre-release mode and clean up changeset dependenci…
boyney123 Feb 19, 2026
c6b2a68
Version Packages (#2190)
github-actions[bot] Feb 19, 2026
ff7c520
fixing discord release webhooks
boyney123 Feb 19, 2026
4b03f95
fix(core): only exclude build artifacts during CI builds (#2191)
boyney123 Feb 19, 2026
6c91fab
Version Packages (#2192)
github-actions[bot] Feb 19, 2026
6bf21c4
fix(core): replace concurrently with native spawn for dev server (#2195)
boyney123 Feb 19, 2026
def46ca
Version Packages (#2196)
github-actions[bot] Feb 19, 2026
6a4e582
feat(cli): improve DSL import with container refs, resource stubs, an…
boyney123 Feb 19, 2026
e7a65ca
fix(changeset): remove ignored dsl-playground from release entry
boyney123 Feb 19, 2026
d71b198
Version Packages (#2199)
github-actions[bot] Feb 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2,934 changes: 2,934 additions & 0 deletions .agents/skills/vercel-react-best-practices/AGENTS.md

Large diffs are not rendered by default.

136 changes: 136 additions & 0 deletions .agents/skills/vercel-react-best-practices/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
---
name: vercel-react-best-practices
description: React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.
license: MIT
metadata:
author: vercel
version: "1.0.0"
---

# Vercel React Best Practices

Comprehensive performance optimization guide for React and Next.js applications, maintained by Vercel. Contains 57 rules across 8 categories, prioritized by impact to guide automated refactoring and code generation.

## When to Apply

Reference these guidelines when:
- Writing new React components or Next.js pages
- Implementing data fetching (client or server-side)
- Reviewing code for performance issues
- Refactoring existing React/Next.js code
- Optimizing bundle size or load times

## Rule Categories by Priority

| Priority | Category | Impact | Prefix |
|----------|----------|--------|--------|
| 1 | Eliminating Waterfalls | CRITICAL | `async-` |
| 2 | Bundle Size Optimization | CRITICAL | `bundle-` |
| 3 | Server-Side Performance | HIGH | `server-` |
| 4 | Client-Side Data Fetching | MEDIUM-HIGH | `client-` |
| 5 | Re-render Optimization | MEDIUM | `rerender-` |
| 6 | Rendering Performance | MEDIUM | `rendering-` |
| 7 | JavaScript Performance | LOW-MEDIUM | `js-` |
| 8 | Advanced Patterns | LOW | `advanced-` |

## Quick Reference

### 1. Eliminating Waterfalls (CRITICAL)

- `async-defer-await` - Move await into branches where actually used
- `async-parallel` - Use Promise.all() for independent operations
- `async-dependencies` - Use better-all for partial dependencies
- `async-api-routes` - Start promises early, await late in API routes
- `async-suspense-boundaries` - Use Suspense to stream content

### 2. Bundle Size Optimization (CRITICAL)

- `bundle-barrel-imports` - Import directly, avoid barrel files
- `bundle-dynamic-imports` - Use next/dynamic for heavy components
- `bundle-defer-third-party` - Load analytics/logging after hydration
- `bundle-conditional` - Load modules only when feature is activated
- `bundle-preload` - Preload on hover/focus for perceived speed

### 3. Server-Side Performance (HIGH)

- `server-auth-actions` - Authenticate server actions like API routes
- `server-cache-react` - Use React.cache() for per-request deduplication
- `server-cache-lru` - Use LRU cache for cross-request caching
- `server-dedup-props` - Avoid duplicate serialization in RSC props
- `server-serialization` - Minimize data passed to client components
- `server-parallel-fetching` - Restructure components to parallelize fetches
- `server-after-nonblocking` - Use after() for non-blocking operations

### 4. Client-Side Data Fetching (MEDIUM-HIGH)

- `client-swr-dedup` - Use SWR for automatic request deduplication
- `client-event-listeners` - Deduplicate global event listeners
- `client-passive-event-listeners` - Use passive listeners for scroll
- `client-localstorage-schema` - Version and minimize localStorage data

### 5. Re-render Optimization (MEDIUM)

- `rerender-defer-reads` - Don't subscribe to state only used in callbacks
- `rerender-memo` - Extract expensive work into memoized components
- `rerender-memo-with-default-value` - Hoist default non-primitive props
- `rerender-dependencies` - Use primitive dependencies in effects
- `rerender-derived-state` - Subscribe to derived booleans, not raw values
- `rerender-derived-state-no-effect` - Derive state during render, not effects
- `rerender-functional-setstate` - Use functional setState for stable callbacks
- `rerender-lazy-state-init` - Pass function to useState for expensive values
- `rerender-simple-expression-in-memo` - Avoid memo for simple primitives
- `rerender-move-effect-to-event` - Put interaction logic in event handlers
- `rerender-transitions` - Use startTransition for non-urgent updates
- `rerender-use-ref-transient-values` - Use refs for transient frequent values

### 6. Rendering Performance (MEDIUM)

- `rendering-animate-svg-wrapper` - Animate div wrapper, not SVG element
- `rendering-content-visibility` - Use content-visibility for long lists
- `rendering-hoist-jsx` - Extract static JSX outside components
- `rendering-svg-precision` - Reduce SVG coordinate precision
- `rendering-hydration-no-flicker` - Use inline script for client-only data
- `rendering-hydration-suppress-warning` - Suppress expected mismatches
- `rendering-activity` - Use Activity component for show/hide
- `rendering-conditional-render` - Use ternary, not && for conditionals
- `rendering-usetransition-loading` - Prefer useTransition for loading state

### 7. JavaScript Performance (LOW-MEDIUM)

- `js-batch-dom-css` - Group CSS changes via classes or cssText
- `js-index-maps` - Build Map for repeated lookups
- `js-cache-property-access` - Cache object properties in loops
- `js-cache-function-results` - Cache function results in module-level Map
- `js-cache-storage` - Cache localStorage/sessionStorage reads
- `js-combine-iterations` - Combine multiple filter/map into one loop
- `js-length-check-first` - Check array length before expensive comparison
- `js-early-exit` - Return early from functions
- `js-hoist-regexp` - Hoist RegExp creation outside loops
- `js-min-max-loop` - Use loop for min/max instead of sort
- `js-set-map-lookups` - Use Set/Map for O(1) lookups
- `js-tosorted-immutable` - Use toSorted() for immutability

### 8. Advanced Patterns (LOW)

- `advanced-event-handler-refs` - Store event handlers in refs
- `advanced-init-once` - Initialize app once per app load
- `advanced-use-latest` - useLatest for stable callback refs

## How to Use

Read individual rule files for detailed explanations and code examples:

```
rules/async-parallel.md
rules/bundle-barrel-imports.md
```

Each rule file contains:
- Brief explanation of why it matters
- Incorrect code example with explanation
- Correct code example with explanation
- Additional context and references

## Full Compiled Document

For the complete guide with all rules expanded: `AGENTS.md`
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
---
title: Store Event Handlers in Refs
impact: LOW
impactDescription: stable subscriptions
tags: advanced, hooks, refs, event-handlers, optimization
---

## Store Event Handlers in Refs

Store callbacks in refs when used in effects that shouldn't re-subscribe on callback changes.

**Incorrect (re-subscribes on every render):**

```tsx
function useWindowEvent(event: string, handler: (e) => void) {
useEffect(() => {
window.addEventListener(event, handler)
return () => window.removeEventListener(event, handler)
}, [event, handler])
}
```

**Correct (stable subscription):**

```tsx
function useWindowEvent(event: string, handler: (e) => void) {
const handlerRef = useRef(handler)
useEffect(() => {
handlerRef.current = handler
}, [handler])

useEffect(() => {
const listener = (e) => handlerRef.current(e)
window.addEventListener(event, listener)
return () => window.removeEventListener(event, listener)
}, [event])
}
```

**Alternative: use `useEffectEvent` if you're on latest React:**

```tsx
import { useEffectEvent } from 'react'

function useWindowEvent(event: string, handler: (e) => void) {
const onEvent = useEffectEvent(handler)

useEffect(() => {
window.addEventListener(event, onEvent)
return () => window.removeEventListener(event, onEvent)
}, [event])
}
```

`useEffectEvent` provides a cleaner API for the same pattern: it creates a stable function reference that always calls the latest version of the handler.
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
---
title: Initialize App Once, Not Per Mount
impact: LOW-MEDIUM
impactDescription: avoids duplicate init in development
tags: initialization, useEffect, app-startup, side-effects
---

## Initialize App Once, Not Per Mount

Do not put app-wide initialization that must run once per app load inside `useEffect([])` of a component. Components can remount and effects will re-run. Use a module-level guard or top-level init in the entry module instead.

**Incorrect (runs twice in dev, re-runs on remount):**

```tsx
function Comp() {
useEffect(() => {
loadFromStorage()
checkAuthToken()
}, [])

// ...
}
```

**Correct (once per app load):**

```tsx
let didInit = false

function Comp() {
useEffect(() => {
if (didInit) return
didInit = true
loadFromStorage()
checkAuthToken()
}, [])

// ...
}
```

Reference: [Initializing the application](https://react.dev/learn/you-might-not-need-an-effect#initializing-the-application)
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
---
title: useEffectEvent for Stable Callback Refs
impact: LOW
impactDescription: prevents effect re-runs
tags: advanced, hooks, useEffectEvent, refs, optimization
---

## useEffectEvent for Stable Callback Refs

Access latest values in callbacks without adding them to dependency arrays. Prevents effect re-runs while avoiding stale closures.

**Incorrect (effect re-runs on every callback change):**

```tsx
function SearchInput({ onSearch }: { onSearch: (q: string) => void }) {
const [query, setQuery] = useState('')

useEffect(() => {
const timeout = setTimeout(() => onSearch(query), 300)
return () => clearTimeout(timeout)
}, [query, onSearch])
}
```

**Correct (using React's useEffectEvent):**

```tsx
import { useEffectEvent } from 'react';

function SearchInput({ onSearch }: { onSearch: (q: string) => void }) {
const [query, setQuery] = useState('')
const onSearchEvent = useEffectEvent(onSearch)

useEffect(() => {
const timeout = setTimeout(() => onSearchEvent(query), 300)
return () => clearTimeout(timeout)
}, [query])
}
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
title: Prevent Waterfall Chains in API Routes
impact: CRITICAL
impactDescription: 2-10× improvement
tags: api-routes, server-actions, waterfalls, parallelization
---

## Prevent Waterfall Chains in API Routes

In API routes and Server Actions, start independent operations immediately, even if you don't await them yet.

**Incorrect (config waits for auth, data waits for both):**

```typescript
export async function GET(request: Request) {
const session = await auth()
const config = await fetchConfig()
const data = await fetchData(session.user.id)
return Response.json({ data, config })
}
```

**Correct (auth and config start immediately):**

```typescript
export async function GET(request: Request) {
const sessionPromise = auth()
const configPromise = fetchConfig()
const session = await sessionPromise
const [config, data] = await Promise.all([
configPromise,
fetchData(session.user.id)
])
return Response.json({ data, config })
}
```

For operations with more complex dependency chains, use `better-all` to automatically maximize parallelism (see Dependency-Based Parallelization).
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
---
title: Defer Await Until Needed
impact: HIGH
impactDescription: avoids blocking unused code paths
tags: async, await, conditional, optimization
---

## Defer Await Until Needed

Move `await` operations into the branches where they're actually used to avoid blocking code paths that don't need them.

**Incorrect (blocks both branches):**

```typescript
async function handleRequest(userId: string, skipProcessing: boolean) {
const userData = await fetchUserData(userId)

if (skipProcessing) {
// Returns immediately but still waited for userData
return { skipped: true }
}

// Only this branch uses userData
return processUserData(userData)
}
```

**Correct (only blocks when needed):**

```typescript
async function handleRequest(userId: string, skipProcessing: boolean) {
if (skipProcessing) {
// Returns immediately without waiting
return { skipped: true }
}

// Fetch only when needed
const userData = await fetchUserData(userId)
return processUserData(userData)
}
```

**Another example (early return optimization):**

```typescript
// Incorrect: always fetches permissions
async function updateResource(resourceId: string, userId: string) {
const permissions = await fetchPermissions(userId)
const resource = await getResource(resourceId)

if (!resource) {
return { error: 'Not found' }
}

if (!permissions.canEdit) {
return { error: 'Forbidden' }
}

return await updateResourceData(resource, permissions)
}

// Correct: fetches only when needed
async function updateResource(resourceId: string, userId: string) {
const resource = await getResource(resourceId)

if (!resource) {
return { error: 'Not found' }
}

const permissions = await fetchPermissions(userId)

if (!permissions.canEdit) {
return { error: 'Forbidden' }
}

return await updateResourceData(resource, permissions)
}
```

This optimization is especially valuable when the skipped branch is frequently taken, or when the deferred operation is expensive.
Loading