diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs
index a6136af8..746aa19a 100644
--- a/docs/.vitepress/config.mjs
+++ b/docs/.vitepress/config.mjs
@@ -79,6 +79,14 @@ export default defineConfig({
},
{ text: "addons", link: "https://github.com/abap2UI5-addons" },
{ text: "samples", link: "https://github.com/abap2UI5/samples" },
+ {
+ text: "samples-controls",
+ link: "https://github.com/abap2UI5/samples-controls",
+ },
+ {
+ text: "samples-stack",
+ link: "https://github.com/abap2UI5/samples-stack",
+ },
{ text: "docs", link: "https://github.com/abap2UI5/docs" },
{
text: "issues",
@@ -409,6 +417,11 @@ export default defineConfig({
collapsed: true,
items: [
{ text: "Reference", link: "/resources/references" },
+ // 615 working apps in three repositories, and until this page the
+ // only way to find out which one to open was to know all three
+ // existed. The cookbook links individual samples per chapter; this
+ // says which CATALOGUE answers which question.
+ { text: "Sample Catalogues", link: "/resources/samples" },
{ text: "Who Uses abap2UI5?", link: "/resources/who_uses" },
{ text: "Release", link: "/resources/changelog" },
{ text: "Deprecations", link: "/resources/deprecations" },
diff --git a/docs/resources/samples.md b/docs/resources/samples.md
new file mode 100644
index 00000000..40ab2356
--- /dev/null
+++ b/docs/resources/samples.md
@@ -0,0 +1,79 @@
+---
+outline: [2, 4]
+---
+# Sample Catalogues
+
+**615 working apps, in three repositories.** Every one is a single ABAP class
+that compiles, renders, and is downported to three releases — so a sample is
+never a fragment you have to trust, it is an app you can pull and run.
+
+The three answer three different questions. Picking the wrong one costs more
+time than reading this page.
+
+| | | you are asking |
+|---|--:|---|
+| [**samples**](https://github.com/abap2UI5/samples/blob/main/SAMPLES.md) | 152 | *has somebody already built this pattern?* — value help, navigation between apps, trees, tables, timers, file up- and download. Runs on a bare abap2UI5 install. |
+| [**samples-controls**](https://github.com/abap2UI5/samples-controls/blob/main/SAMPLES.md) | 431 | *how is this UI5 control expressed in ABAP?* — the UI5 demo kit, rebuilt control by control, grouped by library. |
+| [**samples-stack**](https://github.com/abap2UI5/samples-stack/blob/main/SAMPLES.md) | 32 | *how do I reach my system from an app?* — OData, RAP, APC, MIME, the Fiori Launchpad. Each needs something the framework alone does not give you. |
+
+Start with **samples** if you are learning abap2UI5, with **samples-controls**
+if you know which control you want, and with **samples-stack** only when the
+app has to talk to something in your system.
+
+## The pages have the same shape on purpose
+
+Every row of every catalogue reads the same way:
+
+> **sap.m.Breadcrumbs**
+> Breadcrumbs is useful for displaying link hierarchy
+> breadcrumbs sap.m breadcrumb trail separator link hbox label select
+
+The **title** says which sample it is, the **sentence** says what it shows, and
+the **small type** are the words to search the page for — the terms somebody
+would type who does not yet know the sample exists. `Ctrl+F` on any of the
+three pages is a real search, not a scroll.
+
+None of it is written on the page. All three lines live **on the class**, as
+its abapGit short text and two comment lines above `CLASS … DEFINITION`:
+
+```abap
+" @keywords f4 search help suggestion input dialog select
+" @summary The value help, both halves: suggestions while typing and the F4 dialog behind the field.
+CLASS z2ui5_cl_smp_app_009 DEFINITION PUBLIC.
+```
+
+The catalogues are generated from those lines, and each repository refuses a
+sample that is missing one. So a page can never describe a sample differently
+from the class it links to — and a search engine that drops you into the class
+gives you the same sentence the catalogue would have.
+
+## For AI agents
+
+The same three catalogues are queryable through the
+[MCP server](https://github.com/abap2UI5/ai-mcp) — the `examples` tool searches
+all of them at once and answers with a repository, a class name and a path to
+read, never with a copied snippet:
+
+```
+examples { query: "value help f4" }
+examples { query: "wizard", repo: "samples-controls" }
+```
+
+The neighbouring question — *can abap2UI5 express this UI5 feature at all* — is
+the `capabilities` tool, out of `samples-controls`'
+[CAPABILITIES.md](https://github.com/abap2UI5/samples-controls/blob/main/CAPABILITIES.md).
+Neither answers the other: a control being expressible says nothing about how
+an app that uses it is put together.
+
+## Running one
+
+Install [abap2UI5](https://github.com/abap2UI5/abap2UI5), pull the repository
+with [abapGit](https://abapgit.org), then start any class by name:
+
+```
+?app_start=Z2UI5_CL_SMP_APP_009
+```
+
+Each repository also ships an **overview app** that lists its own samples with
+a search box, so once the repository is in your system you do not need the page
+here at all.