docs: restructure the public IA and fix duplicate page titles - #21
Merged
Merged
Conversation
The docs site worked but was harder to navigate than it needed to be. Two problems in particular: every product shipped both a `X/index` hub and a separate `X/overview` page competing as the entry point, and 26 pages rendered a second `<h1>` because a body heading duplicated the frontmatter title. Information architecture - One hub per product. `chat|code|bot|design/overview` are merged into the matching `index` page and removed; redirects cover the old URLs. - `docs.json` groups are re-cut around what a reader is trying to do: each product tab now runs hub, task guides, and a Help group. - Groups carry `root` pages so a sidebar title opens something real. - Added redirects for paths readers and search engines still hold: `/chat/artifacts`, `/code/goals`, `/troubleshooting`, `/getting-started/desktop-app`, and the merged overviews. Titles - Removed the body `#` heading from the 24 problem pages and `status.mdx`, where it duplicated the frontmatter title. The live pages rendered two `<h1>` elements; the canonical one is the page title. Content - Added `chat/troubleshooting.mdx`. Chat was the only product tab without one while Code, Bot, and CLI each had a page. - Rewrote `platform.mdx` from a placeholder into a real answer about what does and does not exist, and `problems/index.mdx` around status families and the two different 429s. - Gave `api/overview.mdx` and `api/errors.mdx` practical guidance on which problem fields are safe to render. - Every page now closes with a Related or Next section, so no page is a dead end. Home gained a reference grid and a product chooser. Housekeeping - Removed the FernDesk sync workflow, script, test, and docs. Mintlify is the source of truth, so there is no downstream mirror to sync; the workflow would have pushed this rewrite to a second system. - `check-docs-site.mjs` now walks a group's `root` as well as its `pages`, with a regression test. A dead group root would otherwise publish as a 404 sidebar title. - README and AGENTS record the one-hub-per-product rule and the new check. Validation: check-docs-site, its shell suite, docs-ui, and mint validate all pass. Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
Follow-up polish on the IA pass. Two things made pages harder to find than they needed to be: the sidebar and the docs disagreed on names, and several descriptions were long enough to be truncated before they said anything useful. Search - Added `keywords` to every content page, mapping the label a reader sees in the product to the page that documents it. The sidebar says **Artifacts** and the page is Library; it says **Planning** and the page is Plans; it says **Agents** and the page is Cortex Bot. Searching either term now finds the page. No content page relied on this before. - Gave `Sessions` and `Canvases` product-qualified titles, because each name covered two different pages and the pair was indistinguishable in search. `sidebarTitle` keeps the sidebar short, so the pages still read "Sessions" and "Canvases" where space is tight. Metadata - Trimmed 19 descriptions to fit under 160 characters. Longer text is cut off in search results and link previews, so the trailing half was doing no work. No claim changed; where the cut cost a possessive, it was restored. - Fixed the image inventory: `images/product/README.md` still pointed at the four overview pages this branch removed, and `bot-public.png` had gone unused when the Bot pages were merged. The capture is placed again, so every product screenshot is now used on exactly one page. Docs - README and AGENTS record the description limit, the unique-title rule, and the keyword convention, so the next page follows them. Validation: check-docs-site, its shell suite, docs-ui, and mint validate all pass. Re-checked structurally: no orphans, no dead navigation, no broken internal links, no duplicate titles. Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
echobt
marked this pull request as ready for review
September 15, 2026 22:35
Contributor
Author
8 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this is
A structural pass over the public docs at docs.cortex.foundation: one entry point per product, navigation grouped by task, pages findable by the labels the product actually uses, and a fix for a title-rendering bug. Docs-only — no backend or product code is touched.
This PR is intentionally a draft. Do not merge.
Why
The site was complete but harder to navigate than it needed to be. Three concrete problems drove the change:
chat/index("Chat guides") andchat/overview("Overview") both tried to introduce Chat, and the sidebar showed both.<h1>elements. A body heading duplicated the frontmatter title. Verified against live HTML:rate_limitedemitted both<h1 id="page-title">and a second<h1 id="rate_limited">.Chat was also the only product tab with no troubleshooting page, while Code, Bot, and CLI each had one.
IA before and after
cli/indexas the group rootrootpages so group titles open somethingEach product tab now reads: hub, task guides, Help. Groups carry
rootpages so clicking a sidebar title opens a real page instead of only expanding.Page inventory
chat/troubleshooting)Removed pages keep working:
/chat/overview,/code/overview,/bot/overview, and/design/overvieware 301-redirected to the product hub. New redirects also cover/chat/artifacts,/code/goals,/troubleshooting, and/getting-started/desktop-app. All 20 redirects were checked to resolve to a real page with no chains.No orphans, no dead navigation entries, no broken internal links, no duplicate titles (all checked mechanically).
Titles and search
#heading from all 24 problem pages,platform.mdx, andstatus.mdx. Every title now comes from frontmatter exactly once.SessionsandCanvasesproduct-qualified titles, because each name covered two different pages and the pair was indistinguishable in search.sidebarTitlekeeps the sidebar short, so both still read "Sessions" and "Canvases" where space is tight.keywordsto every content page so the product's own label finds the page. Artifacts to Library, Planning to Plans, Agents to Cortex Bot, Customize to Connectors to Tools.Content
chat/troubleshooting.mdx(new) — turns, files and images, models and research, voice, quotas and access. Grounded in behavior already documented on the other Chat pages.platform.mdx— was a placeholder telling contributors what not to write. Now answers the reader's question: no endpoints, no SDK, no keys, what to use instead, and how a launch would be announced.problems/index.mdx— added a status-family table and a note on the two different 429s (rate_limitedversusquota_exceeded).api/overview.mdx,api/errors.mdx— practical guidance on which problem fields to branch on and which are unsafe to render.Copy stays in English, uses Cortex product names and domains, and mentions no other vendor.
Housekeeping
check-docs-site.mjswalked a group'spagesbut not itsroot, so a dead group title would have published as a 404. It now walks both, with a regression test. Verified the test fails without the fix.images/product/README.mdstill pointed at the removed overview pages, andbot-public.pnghad gone unused. Every product screenshot is now used on exactly one page.Safety review
security/overview.mdxstates plainly that Cortex does not claim SOC 2, GDPR certification, or HIPAA; that is the only place those words appear.docs.json.cortex.foundationdomains are referenced.docs-ui.test.mjsstill passes.Validation
All run locally and green:
Also checked mechanically: zero broken internal links, zero orphan pages, zero dead navigation slugs, zero duplicate titles, and every page has a
titleand adescriptionwithin length.The backend contract check (
node scripts/check-docs-site.mjs ../backend) was not run here; it needs a backend checkout. No error codes or endpoints changed, so no coordinated backend PR is required.Follow-ups
images/product/README.mdtracks them; this PR adds no fake art.platform.mdxwill need a real reference if the inference API ships.