Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
367 commits
Select commit Hold shift + click to select a range
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
da4c50d
feat(core): add doc resource reference type for custom documentation …
boyney123 Feb 22, 2026
a7288ea
fix(core): remove docs CTA from domain integrations visualizer (#2197)
thorthelegend99 Feb 22, 2026
fbe8860
fix(core): use CSS variables for dark theme on custom docs feature pa…
boyney123 Feb 22, 2026
56fb47e
Version Packages (#2202)
github-actions[bot] Feb 22, 2026
e1aa05e
chore(core): upgrade @asyncapi/react-component to 3.0.2 (#2205)
boyney123 Feb 23, 2026
b058439
chore(create-eventcatalog): remove unused got/tar deps and bump cross…
boyney123 Feb 23, 2026
deaacc2
chore(core): upgrade @asyncapi/parser to 3.6.0 (#2206)
boyney123 Feb 23, 2026
ce665d0
chore(core): upgrade jsonpath dependency to v1.2.1 (#2210)
boyney123 Feb 23, 2026
f3685b6
chore(sdk): upgrade glob dependency from v11 to v13 (#2209)
boyney123 Feb 23, 2026
19b0bc8
chore(core): upgrade glob dependency from v10 to v13 (#2211)
boyney123 Feb 23, 2026
9eefb33
Version Packages (#2208)
github-actions[bot] Feb 23, 2026
0f946fe
Fix incorrect version-specific channel routing in NodeGraph visualise…
mjftw Feb 23, 2026
dc2fbc9
Version Packages (#2212)
github-actions[bot] Feb 23, 2026
cf7fcac
feat(cli): add DSL-managed key merging and restructure import tests (…
boyney123 Feb 23, 2026
c4104a1
feat(dsl): support template parameters in channel names (#2215)
boyney123 Feb 23, 2026
9d279cc
feat(dsl): add message hydration, shared managed keys, and fix query …
boyney123 Feb 23, 2026
5e7c8d1
Version Packages (#2214)
github-actions[bot] Feb 23, 2026
88de335
fix(core): support nested directory structures in resource docs glob …
boyney123 Feb 23, 2026
aa36cdb
Version Packages (#2220)
github-actions[bot] Feb 23, 2026
22bd7b8
fix(core): use double-star globs for resource doc category patterns (…
boyney123 Feb 23, 2026
b770ffe
Version Packages (#2222)
github-actions[bot] Feb 23, 2026
e9012cb
fix(core): resolve resource docs when folder name differs from frontm…
boyney123 Feb 23, 2026
d4cf9a8
Version Packages (#2224)
github-actions[bot] Feb 23, 2026
25acfdd
feat(sdk): hydrate related services and channels in DSL export (#2225)
boyney123 Feb 24, 2026
a1c5012
feat(dsl): add versioned message refs in visualizer and domain relate…
boyney123 Feb 24, 2026
7531be8
feat(sdk): hydrate containers in DSL export and rename playground to …
boyney123 Feb 24, 2026
f435078
feat(playground): canvas playground UX overhaul (#2229)
boyney123 Feb 24, 2026
780f147
update
boyney123 Feb 24, 2026
e2a7e10
Version Packages (#2226)
github-actions[bot] Feb 24, 2026
d35fbbe
chore(core): bump astro to 5.17.3 and @astrojs/node to 9.5.4 (#2231)
boyney123 Feb 24, 2026
e6a759e
fix(cli): default container_type to database when not specified in DS…
boyney123 Feb 24, 2026
4a3fc5f
fix(changeset): split mixed changeset to fix release pipeline
boyney123 Feb 24, 2026
4ffb9f2
Version Packages (#2233)
github-actions[bot] Feb 24, 2026
6122f93
feat(playground): add download as catalog export option (#2234)
boyney123 Feb 24, 2026
569aac9
fix(changeset): remove ignored package from mixed changeset to fix re…
boyney123 Feb 24, 2026
d0b41c5
Version Packages (#2236)
github-actions[bot] Feb 24, 2026
b1038ed
fix(changeset): remove changeset for ignored dsl-playground package t…
boyney123 Feb 25, 2026
5eb3b8a
add mrfelton as a contributor for code (#2239)
allcontributors[bot] Feb 25, 2026
3a3b9ec
fix(mcp): create McpServer and transport per-request to fix stateless…
boyney123 Feb 25, 2026
a85a4d7
feat(language-server): add AsyncAPI service import and playground aut…
boyney123 Feb 25, 2026
6ee47e7
Version Packages (#2240)
github-actions[bot] Feb 25, 2026
2663850
Add OpenAPI spec import support to DSL language server (#2241)
boyney123 Feb 25, 2026
5ac4bce
Version Packages (#2242)
github-actions[bot] Feb 25, 2026
b3ae0f1
feat(playground): add marketing landing page with hero preview and mo…
boyney123 Feb 25, 2026
e11249b
feat(core): refine UI theme with improved sidebar, dark mode, and hom…
boyney123 Feb 26, 2026
31b931c
fix(core): add type assertions for mouse event on homepage stat cards…
boyney123 Feb 26, 2026
a67f051
fix(visualiser): wire up configurable URL builder to respect base pat…
boyney123 Feb 26, 2026
ad8b333
fix(core): lazy-load visualizer styles and use relative tailwind cont…
boyney123 Feb 27, 2026
0d4892a
chore(core): updated rimraf version (#2251)
boyney123 Feb 27, 2026
a6ad24b
Version Packages (#2245)
github-actions[bot] Feb 27, 2026
b5bbb3d
feat(sdk): add operation type to message interfaces (#2252)
boyney123 Feb 27, 2026
8cfc48f
Version Packages (#2253)
github-actions[bot] Feb 27, 2026
56fae87
fix(core): include visualiser dist in tailwind content paths (#2254)
boyney123 Feb 27, 2026
1b27002
Version Packages (#2255)
github-actions[bot] Feb 27, 2026
304c5cb
fix(visualiser): scope all CSS under .eventcatalog-visualizer for sel…
boyney123 Feb 27, 2026
39da228
Version Packages (#2257)
github-actions[bot] Feb 27, 2026
58fdcf2
fix(core): use theme CSS variables for dark mode in Flow border and f…
boyney123 Feb 27, 2026
ac68e8f
Version Packages (#2259)
github-actions[bot] Feb 27, 2026
da693fb
fix(core): render service sidebar entities as navigable links (#2260)
boyney123 Feb 27, 2026
4386454
Version Packages (#2261)
github-actions[bot] Feb 27, 2026
143fe9c
fix(core): prevent first-run vite dep-scan errors on fresh catalogs (…
boyney123 Feb 27, 2026
2ff44b3
Version Packages (#2265)
github-actions[bot] Feb 27, 2026
4ef3e75
feat(core): migrate from Tailwind CSS v3 to v4 with native Vite plugi…
boyney123 Feb 28, 2026
5d8e66d
Version Packages (#2267)
github-actions[bot] Feb 28, 2026
ce4dcb6
ci: cache npm and use --prefer-offline in verify-build workflow (#2268)
boyney123 Feb 28, 2026
6338c0d
fix(core): add tailwind import to embed page and fix hover border saf…
boyney123 Feb 28, 2026
a43021e
refactor(language-server): simplify duplicated code and fix minor iss…
boyney123 Feb 28, 2026
9a6f801
Refactor language server, add providers and VSCode extension scaffold…
boyney123 Mar 2, 2026
5ca66b4
Version Packages (#2270)
github-actions[bot] Mar 2, 2026
5685340
ci: add manual release workflow for VS Code extension
boyney123 Mar 2, 2026
a87aa6b
ci: fix vscode release permissions and rename extension to EventCatalog
boyney123 Mar 2, 2026
0ab2548
chore(vscode-extension): sync version to 0.1.1 and fix packaging warn…
boyney123 Mar 2, 2026
21f7ed0
chore: release vscode extension v0.2.0
github-actions[bot] Mar 2, 2026
3ea2022
chore(vscode-extension): add icon, README, keywords, and categories
boyney123 Mar 2, 2026
b334cd5
chore: release vscode extension v0.2.1
github-actions[bot] Mar 2, 2026
cb0235a
chore: replace playground.eventcatalog.dev with compass.eventcatalog.…
boyney123 Mar 2, 2026
22d46f7
chore(playground): add opengraph image and meta tags for Compass
boyney123 Mar 2, 2026
29ba5d7
added focusmode changes
boyney123 Mar 2, 2026
8f2d1e9
chore(language-server): add vercel build script for docs
boyney123 Mar 2, 2026
7d5fbb3
update docs
boyney123 Mar 2, 2026
655fe30
fix: build SDK and language-server before docs in build:dsl-docs script
boyney123 Mar 2, 2026
715dffd
feat: add rewrite to proxy /docs to compass docs deployment
boyney123 Mar 2, 2026
e9df7a4
fix: add explicit /docs rewrite for root docs path
boyney123 Mar 2, 2026
cc6c48a
fix: strip /docs prefix in rewrites and remove unused build script
boyney123 Mar 2, 2026
7717402
fix: use regex capture group for docs rewrite to handle nested paths
boyney123 Mar 2, 2026
eeffd02
feat(playground): update landing page copy and fix hash example loading
boyney123 Mar 2, 2026
2f65d95
feat(playground): add analytics, improve modal readability, fix share…
boyney123 Mar 2, 2026
a2eb7d8
update docs
boyney123 Mar 3, 2026
66604c8
Version Packages (#2274)
github-actions[bot] Mar 3, 2026
b86daae
feat(language-server): support inline flow definitions inside domain …
boyney123 Mar 3, 2026
bf0bc02
Version Packages (#2278)
github-actions[bot] Mar 3, 2026
a461a9b
feat(language-server): add cross-file resource completions and improv…
boyney123 Mar 3, 2026
34fc914
Version Packages (#2280)
github-actions[bot] Mar 3, 2026
d41c8c3
fix(visualiser): re-enable hide/show channels toggle (#2283)
boyney123 Mar 3, 2026
7351d98
Version Packages (#2284)
github-actions[bot] Mar 3, 2026
29f57f5
feat(core): add channels section to service sidebar (#2285)
boyney123 Mar 3, 2026
38dcb14
Version Packages (#2286)
github-actions[bot] Mar 3, 2026
2015fc0
chore(core): bump astro to ^5.18.0 and sort dependencies (#2287)
boyney123 Mar 4, 2026
54bd635
feat(playground): track spec file upload events for OpenAPI and AsyncAPI
boyney123 Mar 4, 2026
a5e20a3
Add changelog link to sidebar Quick Reference (#2290)
boyney123 Mar 4, 2026
283c147
feat(sdk): add changelog helper methods (#2291)
boyney123 Mar 4, 2026
d2623c7
Version Packages (#2289)
github-actions[bot] Mar 4, 2026
af2d4f4
feat(cli): add architecture change detection with governance rules an…
boyney123 Mar 5, 2026
7858bf0
Version Packages (#2295)
github-actions[bot] Mar 5, 2026
7ebc6b2
Bump hono dependency to 4.12.4 (#2297)
boyney123 Mar 5, 2026
78bf2d4
Support governance.yml in addition to governance.yaml (#2298)
boyney123 Mar 5, 2026
bcef8cc
feat(cli): add message_deprecated governance trigger (#2301)
boyney123 Mar 5, 2026
7a2fbad
Version Packages (#2299)
github-actions[bot] Mar 5, 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