From edbd391fd3d6ebdbb161b06e9c2a20a11dfc3f65 Mon Sep 17 00:00:00 2001
From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Date: Thu, 20 Aug 2026 17:08:07 +0000
Subject: [PATCH 1/6] docs(library-docs): document supported Doxyfile settings
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
---
fern/products/docs/pages/api-references/library-docs.mdx | 6 ++++--
fern/products/docs/pages/changelog/2026-08-20.mdx | 7 +++++++
2 files changed, 11 insertions(+), 2 deletions(-)
create mode 100644 fern/products/docs/pages/changelog/2026-08-20.mdx
diff --git a/fern/products/docs/pages/api-references/library-docs.mdx b/fern/products/docs/pages/api-references/library-docs.mdx
index 1c27e87876..a3461c05a7 100644
--- a/fern/products/docs/pages/api-references/library-docs.mdx
+++ b/fern/products/docs/pages/api-references/library-docs.mdx
@@ -95,7 +95,7 @@ Local parsing runs each parser inside a Docker container, so [Docker](https://do
-For C++ libraries, the parser uses the source root — your `path` directory, or the repository root for a `git` input — as its scope. If your Doxyfile sets its input directive to subdirectories, the effective scope is the source root combined with those Doxyfile input entries. Ensure the Doxyfile's input paths are relative to the source root.
+For C++ libraries, the parser uses the source root (your `path` directory, or the repository root for a `git` input) as its scope. Input directives in your Doxyfile don't change that scope: Fern honors only [a few Doxyfile settings](#configuration-reference) and ignores the rest.
@@ -207,5 +207,7 @@ You can also edit page content by modifying the MDX files directly — generated
- Path to a custom [Doxyfile](https://www.doxygen.nl/manual/config.html). C++ only. For local generation, the Doxyfile's input paths are resolved relative to the source root: the `input.path` directory, or the repository root for a `git` input.
+ Path to a custom [Doxyfile](https://www.doxygen.nl/manual/config.html). C++ only. Fern reads four settings from it and applies them to its own doxygen configuration: `ALIASES`, `PREDEFINED`, `FILE_PATTERNS`, and `OPTIMIZE_OUTPUT_FOR_C`. `ALIASES` supports parameterized macros and backslash line continuations.
+
+ Every other setting is ignored, including `INPUT`, `INPUT_FILTER`, `GENERATE_XML`, and the `@INCLUDE` and `@INCLUDE_PATH` directives. Publishing fails when one of the four supported settings has an invalid value: a space or shell metacharacter in `FILE_PATTERNS`, a value other than `YES` or `NO` for `OPTIMIZE_OUTPUT_FOR_C`, an `ALIASES` entry that isn't an alias definition, a trailing backslash, or doxygen's `$(VAR)` environment-variable expansion. Doxyfile content over 262,144 characters is also rejected.
diff --git a/fern/products/docs/pages/changelog/2026-08-20.mdx b/fern/products/docs/pages/changelog/2026-08-20.mdx
new file mode 100644
index 0000000000..f86ac7cfbe
--- /dev/null
+++ b/fern/products/docs/pages/changelog/2026-08-20.mdx
@@ -0,0 +1,7 @@
+## Supported Doxyfile settings for C++ library docs
+
+api-reference, security
+
+The [library docs generator](/learn/docs/api-references/library-reference) now reads four settings from a custom Doxyfile and ignores the rest: `ALIASES`, `PREDEFINED`, `FILE_PATTERNS`, and `OPTIMIZE_OUTPUT_FOR_C`. Previously honored settings such as `INPUT`, `INPUT_FILTER`, and `@INCLUDE` directives no longer take effect, and an invalid value for one of the four supported settings fails the docs publish.
+
+
From 19aec569f6294bb6d19be30c22fb07ff9838bf6c Mon Sep 17 00:00:00 2001
From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Date: Wed, 26 Aug 2026 17:07:22 +0000
Subject: [PATCH 2/6] docs: document C++ Doxygen group pages in library docs
generator
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
---
fern/products/docs/pages/api-references/library-docs.mdx | 6 ++++++
fern/products/docs/pages/changelog/2026-08-26.mdx | 7 +++++++
2 files changed, 13 insertions(+)
create mode 100644 fern/products/docs/pages/changelog/2026-08-26.mdx
diff --git a/fern/products/docs/pages/api-references/library-docs.mdx b/fern/products/docs/pages/api-references/library-docs.mdx
index a3461c05a7..ce9bb1375a 100644
--- a/fern/products/docs/pages/api-references/library-docs.mdx
+++ b/fern/products/docs/pages/api-references/library-docs.mdx
@@ -162,6 +162,12 @@ navigation:
```
+## Doxygen groups
+
+For C++ libraries, the groups your source defines with `@defgroup`, `@ingroup`, or `@addtogroup` are rendered as index pages in a `groups/` folder inside `output.path`, alongside the generated namespace folders. Each group page holds the group's Doxygen description, links to its members organized by kind, and links to its subgroups; nested subgroups become nested folders. Member documentation stays on the symbol pages, so group pages don't duplicate content.
+
+Groups whose entire subtree has no members are skipped. The `folder:` navigation entry pointed at `output.path` picks up the group pages, so no navigation change is required.
+
## Customize generated docs (optional)
You can reorganize the output directory to restructure the sidebar navigation. Move, rename, or nest files and subfolders, and Fern picks up the new layout on the next `fern docs dev` or publish.
diff --git a/fern/products/docs/pages/changelog/2026-08-26.mdx b/fern/products/docs/pages/changelog/2026-08-26.mdx
new file mode 100644
index 0000000000..48398c4157
--- /dev/null
+++ b/fern/products/docs/pages/changelog/2026-08-26.mdx
@@ -0,0 +1,7 @@
+## Doxygen group pages for C++ library docs
+
+api-reference
+
+The library docs generator now renders the Doxygen groups your C++ source defines with `@defgroup`, `@ingroup`, or `@addtogroup` as index pages in a `groups/` folder, so your library's own grouping shows up in the docs alongside its namespaces. Group pages carry the group description and link to each member's page, and nested subgroups become nested folders. No extra configuration is required beyond the annotations already in your source.
+
+
From c05e6a444b77f88df8530b481cd88c122a21987b Mon Sep 17 00:00:00 2001
From: "devin.logan"
Date: Wed, 9 Sep 2026 17:36:34 +0000
Subject: [PATCH 3/6] docs(library-docs): fold Doxygen groups into the generate
step
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
---
fern/products/docs/pages/api-references/library-docs.mdx | 8 +-------
fern/products/docs/pages/changelog/2026-08-26.mdx | 2 +-
2 files changed, 2 insertions(+), 8 deletions(-)
diff --git a/fern/products/docs/pages/api-references/library-docs.mdx b/fern/products/docs/pages/api-references/library-docs.mdx
index ce9bb1375a..c77c626ecb 100644
--- a/fern/products/docs/pages/api-references/library-docs.mdx
+++ b/fern/products/docs/pages/api-references/library-docs.mdx
@@ -104,7 +104,7 @@ For C++ libraries, the parser uses the source root (your `path` directory, or th
If you have multiple libraries configured, `fern docs md generate` processes all libraries in parallel. Use `--library plant-sdk` to generate docs for a specific library only.
-The generated docs form a navigation section with pages for each module, class, function, and type in your library.
+The generated docs form a navigation section with pages for each module, class, function, and type in your library. For C++ libraries, groups defined with `@defgroup`, `@ingroup`, or `@addtogroup` also get index pages in a `groups/` folder inside `output.path`: each lists the group's description, its members by kind, and its subgroups (nested as subfolders). Member documentation stays on the symbol pages, groups with no members are skipped, and the `folder:` navigation entry picks the group pages up without changes.
@@ -162,12 +162,6 @@ navigation:
```
-## Doxygen groups
-
-For C++ libraries, the groups your source defines with `@defgroup`, `@ingroup`, or `@addtogroup` are rendered as index pages in a `groups/` folder inside `output.path`, alongside the generated namespace folders. Each group page holds the group's Doxygen description, links to its members organized by kind, and links to its subgroups; nested subgroups become nested folders. Member documentation stays on the symbol pages, so group pages don't duplicate content.
-
-Groups whose entire subtree has no members are skipped. The `folder:` navigation entry pointed at `output.path` picks up the group pages, so no navigation change is required.
-
## Customize generated docs (optional)
You can reorganize the output directory to restructure the sidebar navigation. Move, rename, or nest files and subfolders, and Fern picks up the new layout on the next `fern docs dev` or publish.
diff --git a/fern/products/docs/pages/changelog/2026-08-26.mdx b/fern/products/docs/pages/changelog/2026-08-26.mdx
index 48398c4157..b884ccc750 100644
--- a/fern/products/docs/pages/changelog/2026-08-26.mdx
+++ b/fern/products/docs/pages/changelog/2026-08-26.mdx
@@ -4,4 +4,4 @@
The library docs generator now renders the Doxygen groups your C++ source defines with `@defgroup`, `@ingroup`, or `@addtogroup` as index pages in a `groups/` folder, so your library's own grouping shows up in the docs alongside its namespaces. Group pages carry the group description and link to each member's page, and nested subgroups become nested folders. No extra configuration is required beyond the annotations already in your source.
-
+
From a10f9bb027f9afdf9fbfe42b398fc5678bd63e50 Mon Sep 17 00:00:00 2001
From: "devin.logan"
Date: Wed, 9 Sep 2026 17:37:53 +0000
Subject: [PATCH 4/6] docs(changelog): state Doxyfile allowlist plainly
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
---
fern/products/docs/pages/changelog/2026-08-20.mdx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fern/products/docs/pages/changelog/2026-08-20.mdx b/fern/products/docs/pages/changelog/2026-08-20.mdx
index f86ac7cfbe..3a859dca4b 100644
--- a/fern/products/docs/pages/changelog/2026-08-20.mdx
+++ b/fern/products/docs/pages/changelog/2026-08-20.mdx
@@ -2,6 +2,6 @@
api-reference, security
-The [library docs generator](/learn/docs/api-references/library-reference) now reads four settings from a custom Doxyfile and ignores the rest: `ALIASES`, `PREDEFINED`, `FILE_PATTERNS`, and `OPTIMIZE_OUTPUT_FOR_C`. Previously honored settings such as `INPUT`, `INPUT_FILTER`, and `@INCLUDE` directives no longer take effect, and an invalid value for one of the four supported settings fails the docs publish.
+The [library docs generator](/learn/docs/api-references/library-reference) reads four settings from a custom Doxyfile: `ALIASES`, `PREDEFINED`, `FILE_PATTERNS`, and `OPTIMIZE_OUTPUT_FOR_C`. All other settings, including `INPUT`, `INPUT_FILTER`, and `@INCLUDE` directives, are ignored. An invalid value for one of the four supported settings fails the docs publish.
From 03db8d228ae1c941e11d60e49684eda0bc99dc5e Mon Sep 17 00:00:00 2001
From: "devin.logan"
Date: Wed, 9 Sep 2026 17:38:44 +0000
Subject: [PATCH 5/6] docs(changelog): reorder Doxyfile sentences
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
---
fern/products/docs/pages/changelog/2026-08-20.mdx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fern/products/docs/pages/changelog/2026-08-20.mdx b/fern/products/docs/pages/changelog/2026-08-20.mdx
index 3a859dca4b..b24f78f0cd 100644
--- a/fern/products/docs/pages/changelog/2026-08-20.mdx
+++ b/fern/products/docs/pages/changelog/2026-08-20.mdx
@@ -2,6 +2,6 @@
api-reference, security
-The [library docs generator](/learn/docs/api-references/library-reference) reads four settings from a custom Doxyfile: `ALIASES`, `PREDEFINED`, `FILE_PATTERNS`, and `OPTIMIZE_OUTPUT_FOR_C`. All other settings, including `INPUT`, `INPUT_FILTER`, and `@INCLUDE` directives, are ignored. An invalid value for one of the four supported settings fails the docs publish.
+The [library docs generator](/learn/docs/api-references/library-reference) reads four settings from a custom Doxyfile: `ALIASES`, `PREDEFINED`, `FILE_PATTERNS`, and `OPTIMIZE_OUTPUT_FOR_C`. An invalid value for one of the four supported settings fails the docs publish. All other settings, including `INPUT`, `INPUT_FILTER`, and `@INCLUDE` directives, are ignored.
From b263f560efee6700f8aaa238990d8a8933b47817 Mon Sep 17 00:00:00 2001
From: "devin.logan"
Date: Wed, 9 Sep 2026 18:16:51 +0000
Subject: [PATCH 6/6] docs: drop changelog entries for Doxyfile/Doxygen groups
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
---
fern/products/docs/pages/changelog/2026-08-20.mdx | 7 -------
fern/products/docs/pages/changelog/2026-08-26.mdx | 7 -------
2 files changed, 14 deletions(-)
delete mode 100644 fern/products/docs/pages/changelog/2026-08-20.mdx
delete mode 100644 fern/products/docs/pages/changelog/2026-08-26.mdx
diff --git a/fern/products/docs/pages/changelog/2026-08-20.mdx b/fern/products/docs/pages/changelog/2026-08-20.mdx
deleted file mode 100644
index b24f78f0cd..0000000000
--- a/fern/products/docs/pages/changelog/2026-08-20.mdx
+++ /dev/null
@@ -1,7 +0,0 @@
-## Supported Doxyfile settings for C++ library docs
-
-api-reference, security
-
-The [library docs generator](/learn/docs/api-references/library-reference) reads four settings from a custom Doxyfile: `ALIASES`, `PREDEFINED`, `FILE_PATTERNS`, and `OPTIMIZE_OUTPUT_FOR_C`. An invalid value for one of the four supported settings fails the docs publish. All other settings, including `INPUT`, `INPUT_FILTER`, and `@INCLUDE` directives, are ignored.
-
-
diff --git a/fern/products/docs/pages/changelog/2026-08-26.mdx b/fern/products/docs/pages/changelog/2026-08-26.mdx
deleted file mode 100644
index b884ccc750..0000000000
--- a/fern/products/docs/pages/changelog/2026-08-26.mdx
+++ /dev/null
@@ -1,7 +0,0 @@
-## Doxygen group pages for C++ library docs
-
-api-reference
-
-The library docs generator now renders the Doxygen groups your C++ source defines with `@defgroup`, `@ingroup`, or `@addtogroup` as index pages in a `groups/` folder, so your library's own grouping shows up in the docs alongside its namespaces. Group pages carry the group description and link to each member's page, and nested subgroups become nested folders. No extra configuration is required beyond the annotations already in your source.
-
-