@eventcatalog/core 4.10.13 → 4.10.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/dist/analytics/analytics.cjs +1 -1
  2. package/dist/analytics/analytics.js +2 -2
  3. package/dist/analytics/log-build.cjs +1 -1
  4. package/dist/analytics/log-build.js +3 -3
  5. package/dist/{chunk-SSSN5FXC.js → chunk-HERAHLM2.js} +1 -1
  6. package/dist/{chunk-IIECZFXN.js → chunk-LITOQH56.js} +1 -1
  7. package/dist/{chunk-34RMFKFB.js → chunk-LUW6RDA7.js} +1 -1
  8. package/dist/{chunk-JHUICVBT.js → chunk-ONDFEA5R.js} +1 -1
  9. package/dist/{chunk-PADMH2RJ.js → chunk-V2SKOQYF.js} +1 -1
  10. package/dist/constants.cjs +1 -1
  11. package/dist/constants.js +1 -1
  12. package/dist/docs/api/02-config.md +55 -1
  13. package/dist/docs/development/authentication/providers/03-setting-up-github.md +29 -0
  14. package/dist/docs/development/bring-your-own-documentation/custom-pages/02-adding-custom-docs.md +2 -2
  15. package/dist/docs/development/bring-your-own-documentation/custom-pages/03-components.md +17 -0
  16. package/dist/docs/development/components/07-resource-references.md +7 -1
  17. package/dist/docs/development/components/components/05-architecture-graph.md +65 -0
  18. package/dist/docs/development/components/components/{05-attachments.md → 06-attachments.md} +1 -1
  19. package/dist/docs/development/components/components/{06-channel-information.md → 07-channel-information.md} +1 -1
  20. package/dist/docs/development/components/components/{07-custom-properties.md → 08-custom-properties.md} +1 -1
  21. package/dist/docs/development/components/components/{08-design.md → 09-design.md} +1 -1
  22. package/dist/docs/development/components/components/{09-entitymap.md → 10-entitymap.md} +1 -1
  23. package/dist/docs/development/components/components/{10-flow.md → 11-flow.md} +1 -1
  24. package/dist/docs/development/components/components/{11-link.md → 12-link.md} +1 -1
  25. package/dist/docs/development/components/components/{12-mermaid-file-loader.md → 13-mermaid-file-loader.md} +1 -1
  26. package/dist/docs/development/components/components/{13-message-table.md → 14-message-table.md} +1 -1
  27. package/dist/docs/development/components/components/{14-nodegraph.md → 15-nodegraph.md} +1 -1
  28. package/dist/docs/development/components/components/{15-openapi.md → 16-openapi.md} +1 -1
  29. package/dist/docs/development/components/components/{16-prompt.md → 17-prompt.md} +1 -1
  30. package/dist/docs/development/components/components/{17-remote-schema.md → 18-remote-schema.md} +1 -1
  31. package/dist/docs/development/components/components/{18-resource-group-table.md → 19-resource-group-table.md} +1 -1
  32. package/dist/docs/development/components/components/{19-resource-link.md → 20-resource-link.md} +1 -1
  33. package/dist/docs/development/components/components/{20-schema.md → 21-schema.md} +1 -1
  34. package/dist/docs/development/components/components/{21-schema-viewer.md → 22-schema-viewer.md} +1 -1
  35. package/dist/docs/development/components/components/{22-steps.md → 23-steps.md} +1 -1
  36. package/dist/docs/development/components/components/{23-tabs.md → 24-tabs.md} +1 -1
  37. package/dist/docs/development/components/components/{24-tiles.md → 25-tiles.md} +1 -1
  38. package/dist/docs/development/components/components/{25-visibility.md → 26-visibility.md} +1 -1
  39. package/dist/docs/development/customization/04-documentation-sidebar.md +3 -3
  40. package/dist/docs/development/customization/05-resource-sidebar.md +235 -0
  41. package/dist/docs/development/customization/09-embed-eventcatalog.md +179 -0
  42. package/dist/docs/development/customization/_category_.json +1 -1
  43. package/dist/docs/development/deployment/build-and-deploy.md +4 -0
  44. package/dist/docs/development/deployment/hosting-options.md +1 -1
  45. package/dist/docs/development/deployment/link-validation.md +105 -0
  46. package/dist/docs/development/developer-tools/eventcatalog-linter/00-overview.md +76 -0
  47. package/dist/docs/development/developer-tools/eventcatalog-linter/01-setup.md +144 -0
  48. package/dist/docs/development/developer-tools/eventcatalog-linter/_category_.json +10 -0
  49. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/01-configure-rules.md +130 -0
  50. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/02-run-in-ci.md +93 -0
  51. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/03-use-custom-frontmatter.md +81 -0
  52. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/04-reference-external-catalogs.md +51 -0
  53. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/05-fix-common-problems.md +120 -0
  54. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/_category_.json +12 -0
  55. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/01-cli.md +109 -0
  56. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/02-configuration.md +120 -0
  57. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/03-rules.md +287 -0
  58. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/04-versions.md +77 -0
  59. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/05-supported-resources.md +75 -0
  60. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/_category_.json +12 -0
  61. package/dist/docs/development/guides/97-architecture-graph.md +78 -0
  62. package/dist/docs/development/guides/domains/02-create-domain.md +1 -1
  63. package/dist/docs/development/guides/domains/03-ownership-and-language/02-adding-ubiquitous-language.md +29 -0
  64. package/dist/docs/development/guides/domains/09-reference.md +10 -0
  65. package/dist/docs/development/guides/resources/messages/04-message-channels/02-adding-channels.md +2 -2
  66. package/dist/docs/development/guides/resources/messages/04-message-channels/04-adding-messages-to-services.md +8 -0
  67. package/dist/docs/development/guides/resources/schemas/03-add-specifications-to-services/01-add-openapi-specifications.md +2 -2
  68. package/dist/docs/development/guides/resources/schemas/03-add-specifications-to-services/02-add-asyncapi-specifications.md +3 -3
  69. package/dist/docs/development/guides/systems/05-system-context-maps.md +2 -0
  70. package/dist/docs/development/license-keys/license-validation.md +7 -3
  71. package/dist/docs/development/license-keys/overview.md +7 -3
  72. package/dist/docs/development/upgrading/upgrading.md +3 -3
  73. package/dist/docs/development/upgrading/v2.md +3 -3
  74. package/dist/docs/federation/00-overview.md +158 -0
  75. package/dist/docs/federation/01-first-federation.md +199 -0
  76. package/dist/docs/federation/_category_.json +12 -0
  77. package/dist/docs/federation/explanation/_category_.json +12 -0
  78. package/dist/docs/federation/explanation/how-it-works.md +129 -0
  79. package/dist/docs/federation/explanation/lockfile-and-cache.md +134 -0
  80. package/dist/docs/federation/explanation/mvp-status-and-feedback.md +86 -0
  81. package/dist/docs/federation/explanation/ownership-and-references.md +134 -0
  82. package/dist/docs/federation/how-to/_category_.json +12 -0
  83. package/dist/docs/federation/how-to/configure-github-sources.md +156 -0
  84. package/dist/docs/federation/how-to/configure-validation-rules.md +127 -0
  85. package/dist/docs/federation/how-to/run-in-ci.md +138 -0
  86. package/dist/docs/federation/how-to/share-assets-and-components.md +125 -0
  87. package/dist/docs/federation/how-to/use-local-sources.md +138 -0
  88. package/dist/docs/{plugins/eventcatalog-federation → federation/legacy-federation}/00-introduction.md +11 -2
  89. package/dist/docs/{plugins/eventcatalog-federation → federation/legacy-federation}/01-installation.md +11 -3
  90. package/dist/docs/{plugins/eventcatalog-federation → federation/legacy-federation}/02-plugin-configuration.md +11 -2
  91. package/dist/docs/{plugins/eventcatalog-federation → federation/legacy-federation}/03-examples.md +11 -1
  92. package/dist/docs/{plugins/eventcatalog-federation → federation/legacy-federation}/04-configuration.md +11 -1
  93. package/dist/docs/{plugins/eventcatalog-federation → federation/legacy-federation}/05-setup-team-catalog.md +11 -2
  94. package/dist/docs/federation/legacy-federation/_category_.json +12 -0
  95. package/dist/docs/federation/reference/_category_.json +12 -0
  96. package/dist/docs/federation/reference/cli.md +122 -0
  97. package/dist/docs/federation/reference/configuration.md +192 -0
  98. package/dist/docs/federation/reference/diagnostic-rules.md +173 -0
  99. package/dist/docs/federation/reference/generated-output.md +118 -0
  100. package/dist/docs/federation/reference/supported-content.md +86 -0
  101. package/dist/docs/federation/reference/troubleshooting.md +208 -0
  102. package/dist/docs/plugins/01-intro.md +3 -3
  103. package/dist/docs/plugins/03-all-plugins.md +2 -2
  104. package/dist/docs/plugins/asyncapi/00-intro.md +4 -4
  105. package/dist/docs/plugins/asyncapi/02-plugin-configuration.md +4 -4
  106. package/dist/docs/plugins/backstage/00-overview.md +53 -0
  107. package/dist/docs/plugins/backstage/01-get-started.md +95 -0
  108. package/dist/docs/plugins/backstage/02-embed-entity-tabs.md +109 -0
  109. package/dist/docs/plugins/backstage/03-add-overview-cards.md +79 -0
  110. package/dist/docs/plugins/backstage/04-control-theme-and-size.md +54 -0
  111. package/dist/docs/plugins/backstage/05-migrate-to-annotations.md +49 -0
  112. package/dist/docs/plugins/backstage/06-configuration.md +85 -0
  113. package/dist/docs/plugins/backstage/07-components.md +129 -0
  114. package/dist/docs/plugins/backstage/08-how-embeds-work.md +52 -0
  115. package/dist/docs/plugins/backstage/_category_.json +4 -3
  116. package/dist/docs/plugins/eventbridge/00-intro.md +5 -5
  117. package/dist/docs/plugins/eventbridge/03-api.md +3 -3
  118. package/dist/docs/plugins/graphql/00-intro.md +2 -2
  119. package/dist/docs/plugins/graphql/02-plugin-configuration.md +2 -2
  120. package/dist/docs/plugins/hookdeck/01-intro.md +1 -1
  121. package/dist/docs/plugins/openapi/00-intro.md +1 -1
  122. package/dist/eventcatalog.cjs +1 -1
  123. package/dist/eventcatalog.js +5 -5
  124. package/dist/generate.cjs +1 -1
  125. package/dist/generate.js +3 -3
  126. package/dist/utils/cli-logger.cjs +1 -1
  127. package/dist/utils/cli-logger.js +2 -2
  128. package/eventcatalog/src/components/SchemaExplorer/AvroSchemaViewer.tsx +21 -19
  129. package/eventcatalog/src/components/SchemaExplorer/JSONSchemaViewer.tsx +79 -77
  130. package/eventcatalog/src/components/SchemaExplorer/ProtobufSchemaViewer.test.tsx +91 -0
  131. package/eventcatalog/src/components/SchemaExplorer/ProtobufSchemaViewer.tsx +115 -33
  132. package/eventcatalog/src/components/SchemaExplorer/SchemaViewerHover.test.tsx +33 -0
  133. package/eventcatalog/src/components/SchemaExplorer/protobuf-validation.test.ts +84 -0
  134. package/eventcatalog/src/components/SchemaExplorer/protobuf-validation.ts +149 -0
  135. package/eventcatalog/src/utils/protobuf-schema.ts +211 -16
  136. package/package.json +3 -3
  137. package/dist/docs/cli/channels.md +0 -180
  138. package/dist/docs/cli/commands.md +0 -183
  139. package/dist/docs/cli/custom-docs.md +0 -78
  140. package/dist/docs/cli/data-products.md +0 -177
  141. package/dist/docs/cli/data-stores.md +0 -166
  142. package/dist/docs/cli/diagrams.md +0 -147
  143. package/dist/docs/cli/domains.md +0 -280
  144. package/dist/docs/cli/entities.md +0 -138
  145. package/dist/docs/cli/events.md +0 -186
  146. package/dist/docs/cli/export.md +0 -27
  147. package/dist/docs/cli/governance.md +0 -24
  148. package/dist/docs/cli/messages.md +0 -69
  149. package/dist/docs/cli/queries.md +0 -183
  150. package/dist/docs/cli/services.md +0 -266
  151. package/dist/docs/cli/snapshots.md +0 -44
  152. package/dist/docs/cli/teams.md +0 -75
  153. package/dist/docs/cli/users.md +0 -75
  154. package/dist/docs/cli/utilities.md +0 -43
  155. package/dist/docs/development/developer-tools/eventcatalog-linter.md +0 -732
  156. package/dist/docs/plugins/backstage/00-intro.md +0 -67
  157. package/dist/docs/plugins/backstage/01-installation.md +0 -242
  158. package/dist/docs/plugins/backstage/02-api.md +0 -51
  159. package/dist/docs/plugins/backstage/03-examples.md +0 -12
  160. package/dist/docs/plugins/eventcatalog-federation/_category_.json +0 -11
@@ -0,0 +1,235 @@
1
+ ---
2
+ sidebar_position: 2.5
3
+ keywords:
4
+ - EventCatalog resource sidebar
5
+ - customize sidebar
6
+ - sidebar.json
7
+ sidebar_label: Resource sidebar
8
+ title: Resource sidebar
9
+ description: Define your own sidebar for any resource with a sidebar.json file.
10
+ ---
11
+
12
+ import AddedIn from '@site/src/components/MDX/AddedIn';
13
+
14
+ <AddedIn version="4.10.0" />
15
+
16
+ Every resource in EventCatalog (domains, services, messages, flows, and more) gets a generated sidebar showing its quick reference, architecture, related resources and owners.
17
+
18
+ ![The resource sidebar shown on a system page](./img/resource-sidebar.png)
19
+
20
+ By default, EventCatalog will generate a sidbar for your resources, but sometimes you may want to customize what is shown here — for example runbooks, guides, external links, or your own grouping of events and services.
21
+
22
+ To do this, add a `sidebar.json` file next to the resource's `index.mdx`. This file becomes the sidebar for that resource.
23
+
24
+ ```
25
+ domains/
26
+ Payments/
27
+ index.mdx
28
+ sidebar.json <-- your sidebar for the Payments domain
29
+ ```
30
+
31
+ :::info The file is the sidebar
32
+ When a `sidebar.json` is present it fully replaces the generated sidebar — what you list is what renders, in the order you list it. Nothing is merged in, and anything you don't list isn't shown. Remove the file to get the default sidebar back.
33
+ :::
34
+
35
+ ## Which resources support it?
36
+
37
+ All of them. A `sidebar.json` can sit next to the `index.mdx` of any **domain, system, service, agent, event, command, query, flow, container (data store), entity, data product or ADR**.
38
+
39
+ Versioned copies (`versioned/0.0.1/index.mdx`) inherit the resource folder's `sidebar.json` automatically, unless the versioned folder contains its own.
40
+
41
+ ## Quick start
42
+
43
+ A sidebar is a list of **sections**. A section is either a predefined `$token` (a section EventCatalog generates and keeps up to date for you) or a group you define yourself:
44
+
45
+ ```json title="domains/Payments/sidebar.json"
46
+ {
47
+ "sections": [
48
+ // A predefined section, relabelled from "Quick Reference" to "Overview"
49
+ { "section": "$quick-reference", "title": "Overview" },
50
+ // Your own group — any Lucide icon name works
51
+ {
52
+ "title": "Runbooks",
53
+ "icon": "Siren",
54
+ "pages": [
55
+ // Links to this domain's runbooks/failed-captures documentation page
56
+ "[[doc|runbooks/failed-captures]]",
57
+ // A plain link — external links open in a new tab
58
+ { "title": "Health dashboard", "href": "https://grafana.acme.dev/d/payments" }
59
+ ]
60
+ },
61
+ // Predefined sections, rendered exactly as the default sidebar would
62
+ "$architecture",
63
+ "$services",
64
+ "$owners"
65
+ ]
66
+ }
67
+ ```
68
+
69
+ This renders: an **Overview** section (the generated Quick Reference, relabelled), your own **Runbooks** group, then the generated **Architecture**, **Services** and **Owners** sections.
70
+
71
+ ## Sections
72
+
73
+ Each entry in `sections` is one of three shapes:
74
+
75
+ | Shape | Example | Meaning |
76
+ |-------|---------|---------|
77
+ | Token | `"$architecture"` | A predefined section, rendered exactly as the default sidebar would — and kept up to date as your catalog changes |
78
+ | Adjusted token | `{ "section": "$owners", "title": "Team" }` | A predefined section with a new `title`, `icon` or `collapsed` state |
79
+ | Custom group | `{ "title": "Runbooks", "icon": "Siren", "pages": [...] }` | A group you define. `icon` is any [Lucide](https://lucide.dev) icon name |
80
+
81
+ A predefined section with nothing behind it (for example `$entities` on a domain with no entities) renders nothing — you can safely list sections that only sometimes have content.
82
+
83
+ ## Pages
84
+
85
+ Inside a custom group, each entry in `pages` is one of:
86
+
87
+ | Entry | Example | Renders |
88
+ |-------|---------|---------|
89
+ | Section token | `"$inbound-messages"` | The **items** of a predefined section, spliced into your group — this is how you extend a generated section with your own pages |
90
+ | Resource reference | `"[[service\|payment-api]]"` | The resource, with its own expandable nested sidebar, at its latest version. Messages can pin a version: `"[[event\|payment-captured@1.0.0]]"` — other types always reference the latest |
91
+ | Documentation reference | `"[[doc\|guides/onboarding]]"` | One of this resource's [documentation pages](/docs/development/bring-your-own-documentation/resource-docs/adding-resource-docs), addressed as `<type>/<id>` |
92
+ | Specification reference | `"[[spec\|openapi.yml]]"` | A specification page, with the OpenAPI/AsyncAPI/GraphQL logo and the spec's name |
93
+ | Schema reference | `"[[schema\|payment-captured]]"` | A message's schema page |
94
+ | Link | `{ "title": "Runbook", "href": "https://..." }` | A plain link. External links (any protocol) open in a new tab and show an external-link icon |
95
+ | Nested group | `{ "title": "Internal", "collapsed": true, "pages": [...] }` | A subsection. Groups nest to any depth |
96
+
97
+ Resource references accept any resource type: `domain`, `system`, `service`, `agent`, `event`, `command`, `query`, `flow`, `container`, `entity`, `channel`, `data-product`, `adr`, `diagram`, `team`, `user`.
98
+
99
+ ### Specification and schema references
100
+
101
+ Specifications belong to a resource, so a spec reference names the file — and optionally the resource that owns it:
102
+
103
+ ```json
104
+ "[[spec|openapi.yml]]" // this resource's own spec
105
+ "[[spec|payment-api/openapi.yml]]" // another resource's spec, by id
106
+ "[[spec|service/payment-api/openapi.yml]]" // type-qualified
107
+ ```
108
+
109
+ Specifications always come from the owner's latest version.
110
+
111
+ Schema references point at a message's schema page:
112
+
113
+ ```json
114
+ "[[schema|payment-captured]]" // latest version
115
+ "[[schema|event/payment-captured@1.0.0]]" // type-qualified and pinned to a version
116
+ ```
117
+
118
+ ### Extending a generated section
119
+
120
+ Because a `$token` inside `pages` splices in that section's items, extending a generated section is just wrapping it in your own group — placement is list order:
121
+
122
+ ```json
123
+ {
124
+ "title": "Quick Reference",
125
+ "icon": "BookOpen",
126
+ "pages": [
127
+ // Splices in the generated Quick Reference items (Overview, Changelog, ...)
128
+ "$quick-reference",
129
+ // ...followed by your own pages
130
+ "[[doc|guides/onboarding]]",
131
+ { "title": "Team Slack", "href": "https://acme.slack.com/archives/payments" }
132
+ ]
133
+ }
134
+ ```
135
+
136
+ ### Link placeholders
137
+
138
+ Internal links can use `{collection}`, `{id}` and `{version}` placeholders for the resource the sidebar belongs to, so the same file works across versions:
139
+
140
+ ```json
141
+ // On the Payments domain v1.0.0 this renders as
142
+ // "Visualiser (1.0.0)" -> /visualiser/domains/payments/1.0.0
143
+ { "title": "Visualiser ({version})", "href": "/visualiser/{collection}/{id}/{version}" }
144
+ ```
145
+
146
+ Internal links automatically respect your configured base path.
147
+
148
+ ## Collapsing sections
149
+
150
+ Any object-form section or group accepts `"collapsed": true | false` as its **initial** state — users can still toggle it, and their choice is remembered:
151
+
152
+ ```json
153
+ // Starts collapsed; users can still expand it and their choice is remembered
154
+ { "title": "Internal commands", "collapsed": true, "pages": ["[[command|refund-payment]]"] }
155
+ ```
156
+
157
+ Without `collapsed`, groups with more than five items start collapsed and smaller groups start open.
158
+
159
+ ## Predefined sections
160
+
161
+ Tokens shared by most resource types:
162
+
163
+ `$quick-reference` · `$documentation` · `$architecture` · `$diagrams` · `$decision-records` · `$owners` · `$code` · `$attachments`
164
+
165
+ And per resource type:
166
+
167
+ | Resource | Tokens |
168
+ |----------|--------|
169
+ | Domain | `$api-and-contracts` `$systems` `$subdomains` `$resources` `$services` `$flows` `$entities` `$domain-events` `$external-events` `$resource-groups` `$agents` `$external-integrations` `$data-products` |
170
+ | System | `$resources` `$services` `$flows` `$data-stores` `$entities` |
171
+ | Service / Agent | `$api-and-contracts`* `$resource-groups` `$state-and-persistence` `$entities`* `$outbound-messages` `$inbound-messages` `$channels` `$flows` |
172
+ | Event / Command / Query | `$api-and-contracts` `$producers` `$consumers` `$triggered-by` `$triggers` `$appears-in-flows` |
173
+ | Flow | `$messages` `$services` `$agents` `$subflows` `$data-stores` `$data-products` |
174
+ | Container | `$writes` `$reads` `$appears-in-flows` |
175
+ | Data product | `$inputs` `$outputs` `$data-contracts` `$appears-in-flows` |
176
+ | Entity | `$domains` `$services` |
177
+ | ADR | `$applies-to` `$supersedes` `$superseded-by` `$amends` `$amended-by` `$related-decisions` `$decision-makers` |
178
+
179
+ \* service only.
180
+
181
+ Tokens like `$services` that the default sidebar nests inside a "Resources" umbrella render as top-level sections when you use them directly.
182
+
183
+ ## When something doesn't resolve
184
+
185
+ Mistakes fail fast so your catalog never silently ships a broken sidebar:
186
+
187
+ - An unknown `$token`, or a `[[doc|…]]`, `[[spec|…]]` or `[[schema|…]]` reference that doesn't resolve **fails the build**, with an error naming the file and listing the valid options.
188
+ - A resource reference (like `[[service|…]]`) to something that doesn't exist renders nothing.
189
+
190
+ ## A complete example
191
+
192
+ The [demo catalog](https://demo.eventcatalog.dev/docs/domains/catalog/1.0.0) uses resource sidebars throughout. The Catalog domain's sidebar organizes the domain for its consumers — guides first, then the events other teams integrate with:
193
+
194
+ ```json title="domains/Catalog/sidebar.json"
195
+ {
196
+ "sections": [
197
+ // Generated Quick Reference, relabelled
198
+ { "section": "$quick-reference", "title": "Overview" },
199
+ // The domain's documentation pages, front and center for new consumers
200
+ {
201
+ "title": "Guides",
202
+ "icon": "BookOpen",
203
+ "pages": [
204
+ "[[doc|guides/integrating-with-the-catalog]]",
205
+ "[[doc|guides/product-data-model]]",
206
+ "[[doc|guides/event-versioning]]"
207
+ ]
208
+ },
209
+ // A curated list of the events other teams subscribe to.
210
+ // Each renders with its own expandable nested sidebar.
211
+ {
212
+ "title": "Integration Events",
213
+ "icon": "Radio",
214
+ "pages": ["[[event|product-created]]", "[[event|product-updated]]", "[[event|product-deleted]]"]
215
+ },
216
+ // Generated sections — kept up to date as the catalog changes
217
+ "$architecture",
218
+ "$systems",
219
+ "$entities",
220
+ // Docs mixed with external links in one group
221
+ {
222
+ "title": "Runbooks",
223
+ "icon": "Siren",
224
+ "pages": [
225
+ "[[doc|runbooks/on-call]]",
226
+ "[[doc|runbooks/search-index-lag]]",
227
+ { "title": "Health dashboard", "href": "https://grafana.acme.dev/d/catalog-overview" }
228
+ ]
229
+ },
230
+ // Out of the way until needed
231
+ { "title": "Decisions", "icon": "ClipboardList", "collapsed": true, "pages": ["[[adr|adr-001-use-transactional-outbox]]"] },
232
+ "$owners"
233
+ ]
234
+ }
235
+ ```
@@ -0,0 +1,179 @@
1
+ ---
2
+ sidebar_position: 11
3
+ sidebar_label: Embed EventCatalog
4
+ title: Embed EventCatalog in other applications
5
+ description: Bring EventCatalog documentation, diagrams, schemas, messages, and flows into your internal applications.
6
+ keywords:
7
+ - embed EventCatalog
8
+ - iframe
9
+ - developer portal
10
+ - internal application
11
+ - Scale
12
+ ---
13
+
14
+ import PlanBanner from '@site/src/components/MDX/PlanBanner';
15
+
16
+ <PlanBanner plan="Scale" />
17
+
18
+ You can embed EventCatalog pages in developer portals, internal tools, intranets, and other web applications. Your teams can explore architecture information in the application where they already work while EventCatalog remains the source of the documentation.
19
+
20
+ Embedding EventCatalog requires an EventCatalog Scale license. See [Getting a license key for EventCatalog Scale](/docs/development/license-keys/plans).
21
+
22
+ ## What you can embed
23
+
24
+ | Feature | What users can do in the embedded view |
25
+ | --- | --- |
26
+ | Resource documentation | Read the documentation for a domain, system, service, message, flow, team, or another catalog resource. |
27
+ | Resource visualizer | Explore the selected resource and its relationships. |
28
+ | Architecture Graph | Explore the catalog-wide graph or focus it on a resource with a relationship depth of 1, 2, or 3. |
29
+ | System Context Maps | View the catalog-wide system overview or the context surrounding one system. |
30
+ | Entity maps | Explore the entities and relationships associated with a resource. |
31
+ | Flows | Follow the steps, services, and messages in a business or technical flow. |
32
+ | Discovery tables | Browse and filter catalog resources such as services, events, commands, and queries. |
33
+ | Schema explorer | Search schemas, inspect their contents, and see the resources that use them. |
34
+
35
+ Embedded pages remain interactive. Controls belonging to the selected visualization or table stay available, while EventCatalog's application header and sidebars are removed so they do not compete with the host application's navigation.
36
+
37
+ ## How embedding works
38
+
39
+ Add `embed=true` to a supported EventCatalog URL and load that URL in an iframe. For example:
40
+
41
+ ```text
42
+ https://catalog.example.com/docs/services/order-service/1.0.0?embed=true
43
+ ```
44
+
45
+ You can also request a light or dark color mode for an embed:
46
+
47
+ ```text
48
+ https://catalog.example.com/docs/services/order-service/1.0.0?embed=true&theme=dark
49
+ ```
50
+
51
+ The requested theme only affects that embedded page. It does not replace the visitor's saved EventCatalog theme.
52
+
53
+ ## Before you embed
54
+
55
+ - Build and deploy EventCatalog with a valid Scale license.
56
+ - Use an EventCatalog URL that users of the host application can reach from their browsers.
57
+ - If EventCatalog is authenticated, verify that users can authenticate from the embedded context.
58
+ - Give the iframe's parent a defined height. EventCatalog fills the space the host application provides.
59
+ - Review the host application's Content Security Policy and iframe policy if the browser blocks the page.
60
+
61
+ ## Embed a page
62
+
63
+ ### 1. Choose the EventCatalog page
64
+
65
+ Open the page in EventCatalog and confirm that it contains the content you want users to see. Prefer an explicit resource version so the embedded URL is stable.
66
+
67
+ For example, a service visualizer may have this URL:
68
+
69
+ ```text
70
+ https://catalog.example.com/visualiser/services/order-service/1.0.0
71
+ ```
72
+
73
+ ### 2. Enable embed mode
74
+
75
+ Add `embed=true` to the query string:
76
+
77
+ ```text
78
+ https://catalog.example.com/visualiser/services/order-service/1.0.0?embed=true
79
+ ```
80
+
81
+ Use `&embed=true` instead when the URL already has query parameters.
82
+
83
+ ### 3. Add the iframe
84
+
85
+ Give the container a concrete height and let the iframe fill it:
86
+
87
+ ```html
88
+ <div style="height: 700px; width: 100%;">
89
+ <iframe
90
+ src="https://catalog.example.com/visualiser/services/order-service/1.0.0?embed=true"
91
+ title="Order service architecture"
92
+ loading="lazy"
93
+ style="border: 0; display: block; height: 100%; width: 100%;"
94
+ ></iframe>
95
+ </div>
96
+ ```
97
+
98
+ `height: 100%` only works when the iframe's ancestors have a defined height. Use a fixed, viewport-relative, or layout-controlled height in the host application.
99
+
100
+ ### 4. Select a theme
101
+
102
+ Add `theme=light` or `theme=dark` to force the embedded page's color mode:
103
+
104
+ ```html
105
+ <iframe
106
+ src="https://catalog.example.com/schemas/explorer?embed=true&theme=dark"
107
+ title="Schema explorer"
108
+ ></iframe>
109
+ ```
110
+
111
+ If you omit `theme`, EventCatalog uses the visitor's saved EventCatalog preference or their system preference.
112
+
113
+ ## Embed URL reference
114
+
115
+ Replace `https://catalog.example.com` with the URL of your deployed catalog.
116
+
117
+ | Feature | URL pattern |
118
+ | --- | --- |
119
+ | Resource documentation | `/docs/{collection}/{id}/{version}?embed=true` |
120
+ | Resource visualizer | `/visualiser/{collection}/{id}/{version}?embed=true` |
121
+ | Discovery table | `/discover/{collection}?embed=true` |
122
+ | Entity map | `/visualiser/{collection}/{id}/{version}/entity-map?embed=true` |
123
+ | Data dependency view | `/visualiser/{collection}/{id}/{version}/data?embed=true` |
124
+ | Schema explorer | `/schemas/explorer?embed=true` |
125
+ | Schema details | `/schemas/{type}/{id}/{version}?embed=true` |
126
+ | Architecture Graph | `/visualiser/graph?embed=true` |
127
+ | System Context Map overview | `/visualiser/system-context-map?embed=true` |
128
+ | System-specific context map | `/visualiser/systems/{id}/{version}/context?embed=true` |
129
+ | Flow visualizer | `/visualiser/flows/{id}/{version}?embed=true` |
130
+
131
+ Collections use their plural route names, such as `domains`, `systems`, `services`, `events`, `commands`, `queries`, `flows`, and `entities`. Schema detail pages support message types such as `events`, `commands`, and `queries`, as well as data product contracts.
132
+
133
+ ### Focus the Architecture Graph
134
+
135
+ Use `focus={collection}/{id}` to select the initial resource and `depth` to choose how many relationship hops are visible. `depth` accepts `1`, `2`, or `3`.
136
+
137
+ ```text
138
+ https://catalog.example.com/visualiser/graph?embed=true&focus=services/order-service&depth=2
139
+ ```
140
+
141
+ The Architecture Graph must be enabled in `eventcatalog.config.js`:
142
+
143
+ ```js title="eventcatalog.config.js"
144
+ module.exports = {
145
+ visualiser: {
146
+ architectureGraph: {
147
+ enabled: true,
148
+ },
149
+ },
150
+ };
151
+ ```
152
+
153
+ ## Troubleshooting
154
+
155
+ ### EventCatalog shows a license overlay
156
+
157
+ Confirm that the deployed catalog was built or started with a valid Scale license. Add the key to the EventCatalog project's environment:
158
+
159
+ ```bash title=".env"
160
+ EVENTCATALOG_SCALE_LICENSE_KEY=your-scale-license-key
161
+ ```
162
+
163
+ Then rebuild and redeploy the catalog. See [Getting a license key for EventCatalog Scale](/docs/development/license-keys/plans).
164
+
165
+ ### Navigation is still visible
166
+
167
+ Confirm that the URL contains `embed=true`, including the exact lowercase value `true`.
168
+
169
+ ### The iframe is blank or blocked
170
+
171
+ Open the iframe URL directly in the same browser. Confirm that it is reachable and that the user can authenticate. Then check the browser console for Content Security Policy, mixed-content, or iframe permission errors from either application.
172
+
173
+ ### The content does not fill the available height
174
+
175
+ Set an explicit height on the iframe's parent and keep the iframe at `height: 100%`. Check every ancestor if you use a percentage height.
176
+
177
+ ## Backstage
178
+
179
+ If your host application is Backstage, use the [EventCatalog Backstage plugin](/docs/plugins/backstage/overview). It supplies React components, resolves EventCatalog resources from Backstage entity annotations, and constructs the embed URLs for you.
@@ -7,6 +7,6 @@
7
7
  "type": "generated-index",
8
8
  "slug": "development/customization",
9
9
  "title": "Customization Documentation",
10
- "description": "Learn how to customize EventCatalog."
10
+ "description": "Customize EventCatalog and embed its documentation and visualizations in other applications."
11
11
  }
12
12
  }
@@ -32,6 +32,10 @@ This will output one directory
32
32
 
33
33
  - `dist` - Your EventCatalog as Static HTML
34
34
 
35
+ ### Link validation
36
+
37
+ Static builds check internal links and anchors and report warnings by default. See [link validation](/docs/development/deployment/link-validation) to fail builds on broken links, ignore destinations, or disable the check.
38
+
35
39
  ### Passing custom options
36
40
 
37
41
  <AddedIn version="2.16.5" />
@@ -22,7 +22,7 @@ By default EventCatalog will build a static website.
22
22
 
23
23
  Here are some guides and places you can host static content
24
24
 
25
- - [Host with Docker](#hosting-with-docker)
25
+ - [Host with Docker](#hosting-static-website-with-docker)
26
26
  - [Deploy to NextJS](https://nextjs.org/docs/deployment)
27
27
  - [Host in AWS S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html)
28
28
 
@@ -0,0 +1,105 @@
1
+ ---
2
+ sidebar_position: 5
3
+ sidebar_label: Link validation
4
+ title: Link validation
5
+ description: Catch broken links and anchors before they reach production
6
+ ---
7
+
8
+ After a static build, EventCatalog scans every generated HTML page and reports internal links and anchors that don't resolve. This catches typos in [resource references](/docs/development/components/resource-references), renamed pages, and moved custom docs before they ship.
9
+
10
+ ## What gets checked
11
+
12
+ - Links between pages rendered by your catalog, including the sidebar navigation.
13
+ - Anchors (`#section`) on the destination page, so a link to a heading that no longer exists is caught too.
14
+ - Links are resolved against your [`base`](/docs/api/config#base) path, so this works the same whether your catalog is hosted at the root or a subpath.
15
+
16
+ Only links on the same origin and under the catalog's `base` path are checked. Set [`homepageLink`](/docs/api/config#homepageLink) to your deployed URL so absolute links to your own catalog are recognized as internal. External links and non-HTTP links such as `mailto:` are skipped.
17
+
18
+ Links to files in the build output are checked for existence, but fragments in non-HTML files such as PDFs are not validated. Links created only by client-side JavaScript are not checked, except for sidebar navigation.
19
+
20
+ :::info
21
+ Link validation only runs after a [static build](/docs/development/deployment/build-and-deploy). It's skipped when running in [SSR mode](/docs/development/deployment/build-ssr-mode), since pages are rendered on demand rather than generated up front.
22
+ :::
23
+
24
+ ## Configure the check
25
+
26
+ By default, broken links and anchors are logged as warnings and the build still succeeds.
27
+
28
+ ```js title="eventcatalog.config.js"
29
+ module.exports = {
30
+ linkValidation: {
31
+ onBrokenLinks: 'warn',
32
+ onBrokenAnchors: 'warn',
33
+ },
34
+ };
35
+ ```
36
+
37
+ Set either option to `error` to fail the build instead, or `ignore` to skip that check completely.
38
+
39
+ ```js title="eventcatalog.config.js"
40
+ module.exports = {
41
+ linkValidation: {
42
+ onBrokenLinks: 'error',
43
+ onBrokenAnchors: 'ignore',
44
+ },
45
+ };
46
+ ```
47
+
48
+ Turn the whole feature off by setting `linkValidation` to `false`.
49
+
50
+ ```js title="eventcatalog.config.js"
51
+ module.exports = {
52
+ linkValidation: false,
53
+ };
54
+ ```
55
+
56
+ ## Ignore known destinations
57
+
58
+ Some links can't be verified during the build, such as pages generated by a separate process. Use `ignore` with glob patterns for the destination paths. See [`linkValidation.ignore`](/docs/api/config#linkvalidationignore) for how paths are matched.
59
+
60
+ ```js title="eventcatalog.config.js"
61
+ module.exports = {
62
+ linkValidation: {
63
+ ignore: ['/api/**', '/docs/legacy/*'],
64
+ },
65
+ };
66
+ ```
67
+
68
+ ## Run in CI
69
+
70
+ Set both checks to `error` in CI to fail the build on broken links or anchors. Keep `warn` locally if you want the build to succeed while you fix them.
71
+
72
+ ```js title="eventcatalog.config.js"
73
+ module.exports = {
74
+ linkValidation: {
75
+ onBrokenLinks: process.env.CI ? 'error' : 'warn',
76
+ onBrokenAnchors: process.env.CI ? 'error' : 'warn',
77
+ },
78
+ };
79
+ ```
80
+
81
+ ```yaml title=".github/workflows/build-catalog.yml"
82
+ name: Build catalog
83
+ on:
84
+ pull_request:
85
+
86
+ jobs:
87
+ build:
88
+ runs-on: ubuntu-latest
89
+ steps:
90
+ - uses: actions/checkout@v4
91
+ - uses: actions/setup-node@v4
92
+ with:
93
+ node-version: 20
94
+ - run: npm install
95
+ - run: npm run build
96
+ env:
97
+ CI: true
98
+ ```
99
+
100
+ When a check is set to `error`, broken destinations fail the build. Diagnostics group references by destination and show up to five source pages per destination. For user/team and event/command/query mixups, EventCatalog suggests an alternative only when that destination exists in the build.
101
+
102
+ ## Related
103
+
104
+ - [`eventcatalog.config.js` reference](/docs/api/config#linkValidation) for the full list of options
105
+ - [Resource references](/docs/development/components/resource-references) for linking to catalog resources
@@ -0,0 +1,76 @@
1
+ ---
2
+ sidebar_position: 1
3
+ slug: /development/developer-tools/eventcatalog-linter
4
+ keywords:
5
+ - EventCatalog linter
6
+ - schema validation
7
+ - reference validation
8
+ - CI/CD
9
+ - quality assurance
10
+ sidebar_label: Overview
11
+ title: EventCatalog Linter
12
+ description: Catch broken references, typos, misplaced files and missing metadata in your EventCatalog before they reach a build or a reader.
13
+ ---
14
+
15
+ import AddedIn from '@site/src/components/MDX/AddedIn';
16
+
17
+ The EventCatalog Linter is a command-line tool that checks your catalog for the mistakes EventCatalog itself would otherwise ignore or only surface at build time: a service that `sends` an event that doesn't exist, a typo like `owner:` instead of `owners:`, a `schemaPath` that points at nothing, or a file saved in a folder EventCatalog never reads.
18
+
19
+ Run it locally while you write documentation, or in CI so every pull request is checked.
20
+
21
+ ```bash
22
+ npx @eventcatalog/linter
23
+ ```
24
+
25
+ ```
26
+ services/order-service/index.mdx
27
+ 6:1 ✖ error Unknown property "owner". Did you mean "owners"? [owner] (schema/unknown-field)
28
+ 9:5 ✖ error Referenced event/command/query "OrderCreatd" does not exist. Did you mean "OrderCreated"? [sends[0]] (refs/resource-exists)
29
+ 14:1 ⚠ warning Resource should have a markdown description (body content) beyond just frontmatter [description] (best-practices/description-required)
30
+
31
+ ✖ 3 problems (2 errors, 1 warning) in 1 file
32
+ 178 files checked
33
+ ```
34
+
35
+ ## What it checks
36
+
37
+ | Area | Examples |
38
+ |------|----------|
39
+ | **Frontmatter schemas** | Required fields, field types, version formats, unknown or misspelled keys |
40
+ | **References** | Owners, messages, services, domains, channels, containers, flow steps and entity relationships point at resources (and versions) that exist |
41
+ | **Files** | `schemaPath`, `schemas[]`, `specifications`, data product contracts and `public/` icons resolve to real files |
42
+ | **Catalog structure** | Duplicate ids, markdown files in places EventCatalog won't load |
43
+ | **Documentation quality** | Summaries, owners, body content and message schemas are present |
44
+ | **Versioning** | References to deprecated resources |
45
+
46
+ Every finding comes with a `line:column` position, the rule that produced it, and — where the linter can work it out — a suggestion for the fix.
47
+
48
+ ## Where to go next
49
+
50
+ - **[Set up the linter](./01-setup.md)** — a guided walk-through from the first run to a CI check. Start here if you haven't used the linter before.
51
+ - **[How-to guides](/docs/development/developer-tools/eventcatalog-linter/how-to)** — recipes for specific jobs: [configure rules](./how-to/01-configure-rules.md), [run in CI](./how-to/02-run-in-ci.md), [allow custom frontmatter](./how-to/03-use-custom-frontmatter.md), [reference resources from other catalogs](./how-to/04-reference-external-catalogs.md), [fix common problems](./how-to/05-fix-common-problems.md).
52
+ - **[Reference](/docs/development/developer-tools/eventcatalog-linter/reference)** — every [CLI option](./reference/01-cli.md), the [configuration file](./reference/02-configuration.md), [all rules](./reference/03-rules.md) with their messages and options, [version formats](./reference/04-versions.md) and the [files the linter scans](./reference/05-supported-resources.md).
53
+
54
+ ## What's new
55
+
56
+ <AddedIn version="1.1.17" pkg="@eventcatalog/linter" url="https://github.com/event-catalog/eventcatalog" />
57
+
58
+ The latest release focuses on catching the mistakes people actually make and pointing at exactly where they are:
59
+
60
+ - **Line and column numbers** on every finding, so terminals and editors can jump straight to the problem.
61
+ - **Unknown frontmatter keys** are flagged with "did you mean" suggestions ([`schema/unknown-field`](./reference/03-rules.md#schemaunknown-field)). EventCatalog fails the build on these; the linter now catches them first.
62
+ - **Misplaced files** — `events/OrderCreated.mdx` instead of `events/OrderCreated/index.mdx`, `event/` instead of `events/`, users saved as folders — are reported with the intended location ([`structure/unrecognised-file`](./reference/03-rules.md#structureunrecognised-file)).
63
+ - **Broken file references** — `schemaPath`, specifications, contracts and icons that don't exist ([`refs/file-exists`](./reference/03-rules.md#refsfile-exists)).
64
+ - **Clearer reference errors**: "this resource doesn't exist — did you mean `OrderCreated`?" is now distinct from "this resource exists, but not at version `2.1.0` — available: `2.0.0`, `1.0.0`".
65
+ - **Version formats match EventCatalog**: `1`, `1.2`, `v1` and `V2` are accepted everywhere EventCatalog accepts them.
66
+ - `eventcatalog-linter --init` scaffolds a fully commented config; `--quiet`, `--max-warnings` and `--no-color` were added; progress output stays out of CI logs; the summary reports how many files were actually checked.
67
+
68
+ Read the [rules reference](./reference/03-rules.md) for the full list, or the [original announcement](/blog/eventcatalog-linter) for the background.
69
+
70
+ ## Supported resources
71
+
72
+ The linter understands every resource type EventCatalog does: domains and subdomains, systems, services, events, commands, queries, channels, flows, entities, agents, containers, data products, diagrams, ADRs, users and teams — including versioned copies under `versioned/` and content pulled in through federation. See [Supported resources](./reference/05-supported-resources.md) for the exact folders and file names it scans.
73
+
74
+ ## Issues?
75
+
76
+ If you have any issues or feedback, please open an issue on [GitHub](https://github.com/event-catalog/eventcatalog/issues) or join our [Discord server](https://eventcatalog.dev/discord).