## What
Move the **Changelog** entry in the API Reference sidebar so it sits
**immediately below Overview** (second item from the top), instead of
after **Errors**.
## Why
Requested placement — Changelog should be pinned right under Overview at
the top of the Reference nav for visibility.
## How
The Changelog node is injected programmatically in
`app/(home)/reference/(v31)/layout.tsx` (it's not a `meta.json` page).
Previously it was inserted at `errorsIdx + 1`; now it's inserted at
`overviewIdx + 1`, with a safe fallback to position 1 if "Overview"
isn't found.
Before: `Overview → Authentication → Rate Limits → Errors → Changelog →
API Reference → …`
After: `Overview → Changelog → Authentication → Rate Limits → Errors →
API Reference → …`
Only affects the v3.1 (default) Reference layout; the v3 layout doesn't
inject a Changelog node.
## Verification
- `bun run types:check` passes.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
## Summary
- stop loading the Decimal widget globally from the docs root layout
- load the Decimal script only when the user clicks Ask AI or uses the
shortcut
- preserve Decimal theme syncing after the widget has loaded
## Why
Slack/GSC investigation pointed at mobile CLS regressions on docs pages.
Lighthouse trace comparison isolated the layout shift to the Decimal
iframe/sidebar; blocking Decimal took /docs CLS from ~0.302 to 0, while
blocking PostHog did not change CLS.
## Validation
- bun run types:check
- bunx eslint app/layout.tsx components/ask-ai-button.tsx
components/custom-search-dialog.tsx components/decimal-widget.ts
- bun run test
- local Playwright check on http://localhost:3000/docs: no getdecimal
scripts or requests before interaction; after clicking Ask AI the
Decimal script loads and the sidebar opens
## Notes
- full `bun run lint` is still red on existing unrelated docs lint
issues on next, including @next/next/no-html-link-for-pages and
react-hooks compiler rules in other files
## Summary
- **Dark/light theme switcher** in the navbar. Drops `forcedTheme:
'light'` so the toggle actually flips themes; sidebar footer toggle
stays disabled so there's only one switcher.
- **Dark mode color pass.** `--composio-brand` lifts to a muted
`#5B8BF0` (the deep `#0007cd` brand reads as unlit text on `#0f0f0f`).
Card / muted greys nudge to `#1c1c1c` / `#1f1f1f`. Borders drop from 10%
white to 6% so card edges sit back. `--border` / `--sidebar-border`
follow suit.
- **Square navbar.** Search input and the new theme toggle render with
`border-radius: 0` to match the rest of the navbar.
- **Welcome-page scroll reset.** New `ScrollReset` client component
wired into the root layout. Next.js App Router skips its built-in scroll
reset when the new route resolves to the same dynamic `page.tsx` segment
— every link from the welcome page to a `/docs/*` page hits this case,
so users were landing mid-page on the new route. Now `usePathname()`
change ⇒ `window.scrollTo(0, 0)` (skips first render and any
hash-bearing navigation).
- **`platform.composio.dev` → `dashboard.composio.dev`** across docs
content + the direct-execution LLM guardrail (28 files).
`docs/public/openapi*.json` left alone — auto-generated, and the
surviving reference is literally to the legacy dashboard.
## Test plan
- [ ] Toggle theme from the navbar; verify both light and dark render
- [ ] In dark mode, confirm "Docs" nav active state, chip icons,
"CONNECTED" labels, and Ask AI button read clearly against `#0f0f0f`
- [ ] Scroll to the bottom of `/docs`, click any link in HomeResources /
HomeSurfaces / HomeFeatures — the new page should land at scroll 0
- [ ] Click a TOC `#anchor` link inside a docs page — should still
scroll to the anchor (not get clobbered to 0)
- [ ] Spot-check a few rewritten URLs in cookbooks / quickstart — all
`platform.composio.dev` should now be `dashboard.composio.dev`
🤖 Generated with [Claude Code](https://claude.com/claude-code)
## Summary
Reworks the docs welcome page (`/docs`) into a two-column hero with an
animated agent chat mock + tool overlay, plus four restructured homepage
sections.
### Hero (`DocsHeroV2`)
- Left: headline (`Start building with Composio.`), short sub,
brand-blue chip column (Quickstart, API reference, Toolkits).
- Right (lg+ only): mock chat panel with the v1 hero's per-agent skin
(`Claude Cowork` / `ChatGPT Codex` / `Your AI Agent`), step-by-step
timeline-driven animation (user prompt → thinking dots → tool-trail
items → assistant response), and a floating "active tool" card layered
over the chat's left edge.
- L-shape SVG connector between chat and overlay: muted grey resting
state + brand-blue glow + bright line that re-draw via `pathLength` on
every tool change.
- Mock chat hidden below lg.
### Homepage sections
- **`HomeFeatures`** — `Everything you need to ship production agents.`
2×2 grid with bespoke visuals per pillar: 8×2 toolkit grid with `+1K`
cell, sessions panel (`USER_ID` + connected apps), triggers feed (`LIVE`
indicator + recent events), and a workbench mock with animated 4×2 CPU
lights. `auto-rows-fr` on `sm:` so cards equalize on tablet/desktop but
breathe on mobile.
- **`HomeSurfaces`** — `Three ways to use Composio.` bento: Developer
card spans full width (`md:col-span-3`) and shows 8 provider logos
(Anthropic, OpenAI, Vercel AI, Google, LangChain, CrewAI, LlamaIndex,
Mastra). Row 2: For You (with Claude / Codex / Cursor / Windsurf /
OpenClaw client logos), CLI (with `curl ... | bash` install snippet and
functional copy button), Agents.
- **`HomeResources`** — `Reach for the rest.` six-card footer row with
Quickstart, API reference, Cookbooks, Changelog, Toolkits,
Troubleshooting.
### Other
- Ports the landing-page hero into `components/landing-hero/` (kept
under the original `DocsHero` for easy revert; commented out, V2 wired
in).
- Theme-aware `--hero-*` CSS vars for chat-skin colors so the chat reads
in both light and dark.
- Removes the old `Works with your stack` provider grid (the providers
now live inside the Developer surface card).
## Test plan
- [ ] Verify hero animation cycles through 3 examples on desktop
- [ ] Verify L-shape connector pulses in brand blue on every tool change
- [ ] Verify chat mock is hidden on mobile and left column reads on its
own
- [ ] Verify dark mode (chat skins, connector, card surfaces, code
blocks)
- [ ] Verify CLI install copy button copies and toggles the icon to ✓
- [ ] Verify all chip / card hrefs resolve
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary
- Rework the CLI docs around Composio for You / Claude Code usage, with
sections for knowledge work, `run`/sub-agents, trigger listening,
developer workflows, and unsupported direct CLI embedding.
- Move CLI into the top of Other topics and remove single-toolkit MCP
from the Docs sidebar.
- Move Changelog into Reference after Errors, with a grouped single-page
changelog, scroll-based date anchors, and redirects from old
`/docs/changelog` URLs.
- Add the Claude logo to the “Open in Claude” page action.
## Tests
- `cd docs && bun run lint:links`
- `cd docs && bun test tests/static/navigation.test.ts`
- `cd docs && bun run build`
## Summary
Three small docs polishes:
- **Hide the disgusting "Ask AI" side tab.** The Decimal widget renders
its own `.decimal-widget-sidebar-tab` launcher (vertical pill with
sideways text) on every page. We already trigger the widget from our own
"Ask AI" button in the nav, so the third-party launcher is redundant
*and* ugly. Hidden via CSS in `app/global.css`.
- **Fix the Playground nav link.** It pointed at
`platform.composio.dev/auth?next_page=/tool-router` — which (a) hits a
dead host now that platform has moved to `dashboard.composio.dev`, and
(b) lost the playground's connect check on the redirect. Repointed to
`https://dashboard.composio.dev/~/project/playground`, which is the
dashboard's smart-resolver route: it handles login (`?next=`), looks up
`last_visited` / default org+project, and lands the user on
`/{org}/{project}/playground` with the connect step intact. Same fix
applied to the toolkits landing CTA and the welcome-page Playground
card.
- **Trim the welcome page.** Dropped the duplicated intro Cards row, the
"Get Started" / "Explore" / "Features" / "Community" headers, and the
secondary Features grid. Now it's: intro → AIToolsBanner → Quickstart →
Toolkits + Playground → Providers. Much cleaner.
## Test plan
- [ ] `bun run scripts/validate-links.ts` passes (already verified
locally — 0 errors)
- [ ] On preview deploy, the side "Ask AI" tab is gone
- [ ] Clicking "Playground" in the nav (logged out) lands on login →
playground; (logged in) lands on `/{org}/{project}/playground`
- [ ] Welcome page renders without missing-icon errors
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary
- Re-apply the Algolia docs search migration after the previous PR was
merged and reverted.
- Keep the existing Fumadocs search UI while using Algolia API when
search keys are configured, with `/api/search` fallback for local
development and tests.
- Add a first-party Algolia index builder/sync script that creates
section-sized docs records from MDX/OpenAPI/toolkit/changelog content,
configures index relevance settings, and replaces index objects without
relying on Algolia Crawler.
- Add Algolia Insights view/click events and a terminal search relevance
test script.
- Clean search breadcrumbs so results show labels like `Toolkit` and
`Cookbook` instead of duplicated `toolkits > Gmail` formatting.
## Tests
- `cd docs && bun run types:check`
- `cd docs && bun run sync:search --dry-run`
- `cd docs && bunx eslint components/custom-search-dialog.tsx
lib/search-index.ts scripts/sync-algolia-search.ts
scripts/test-algolia-search.ts`
## Notes
- Live Algolia sync requires `ALGOLIA_ADMIN_API_KEY`.
- Live search relevance tests require `ALGOLIA_SEARCH_API_KEY` or
`NEXT_PUBLIC_ALGOLIA_SEARCH_API_KEY`.
## Summary
- Switch docs search dialog to Algolia when public Algolia env vars are
configured, with local `/api/search` fallback for development/tests
- Add a shared docs search index builder plus `bun run sync:search` to
publish records to Algolia
- Add a GitHub Actions workflow to dry-run and sync the Algolia index on
`next` docs changes when secrets are configured
- Document required Algolia env vars and sync command
## Tests
- `cd docs && bun run types:check`
- `cd docs && bun run sync:search --dry-run`
- `cd docs && bun test tests/static/`
- `cd docs && bunx eslint components/custom-search-dialog.tsx
lib/search-index.ts scripts/sync-algolia-search.ts`
- `cd docs && bun run build`
## Notes
- `bun run lint` still fails on existing unrelated repo-wide lint errors
in files outside this change (for example `app/global-error.tsx`,
`components/ask-ai-button.tsx`, `components/version-selector.tsx`). The
changed search files pass targeted ESLint.
- Production search requires `NEXT_PUBLIC_ALGOLIA_APP_ID`,
`NEXT_PUBLIC_ALGOLIA_SEARCH_API_KEY`, and optionally
`NEXT_PUBLIC_ALGOLIA_INDEX_NAME` (default `composio_docs`). Index
syncing requires `ALGOLIA_APP_ID`/`ALGOLIA_ADMIN_API_KEY` secrets.
Use overflow-x: clip instead of hidden on body to avoid iOS Safari scroll
blocking, and replace all vh units with dvh for proper mobile viewport handling.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fixes edge case where additionalProperties inside array items of an
additionalProperties schema wouldn't recurse into nested children.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Schemas using additionalProperties (e.g. JIRA_GET_ISSUE_CREATE_METADATA's
FieldMetadata map) were silently dropped, rendering as empty "object" types.
Now they display as [key: string] entries with full nested structure, matching
the fumadocs-openapi convention.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add overflow-x:hidden and max-width transition to body so the Decimal
push-sidebar animates smoothly without horizontal scroll
- Replace stale module-level widgetOpen flag with DOM query
(`.decimal-widget-sidebar.open`) so toggle stays in sync when the
widget is closed by the user directly
- Bump AI tools banner two-column breakpoint from sm to md so it stacks
gracefully when the sidebar squeezes the content area
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Move back link, title, and PageActions outside the prose wrapper so
anchor styles don't override the component's own styling.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace YOUR_API_KEY with $COMPOSIO_API_KEY in cURL examples to
avoid triggering gitleaks curl-auth-header rule. Improve link
descriptions in toolkits markdown index.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add searchable managed auth page at /toolkits/managed-auth with tabs
for managed vs unmanaged OAuth toolkits, copy slugs, and auto-tab
switching on search. Use fumadocs Cards on toolkits landing page.
Add server-side markdown generation for LLM view. Fix title/back-link
ordering for toolkit MDX pages.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Move composio-connect from Resources to Get Started section in sidebar
- Remove expired CSS "NEW" badge from CLI sidebar item (was due 2026-03-06)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The previous CSS used div[data-empty] to target the SearchDialogList,
which is a fumadocs internal attribute. Replace with a controlled
wrapper div (.search-scroll-container) around the results area so the
flex-shrink and max-height overrides apply regardless of list state.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The search results list was unscrollable on mobile because the dialog
had no max-height constraint and the inner list used a fixed max-h of
460px that exceeded the viewport when the keyboard was open. Constrain
the dialog to 100dvh on mobile with flex layout so the list shrinks to
fit the available space.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Strip .md extension from slug before matching so links from the
meta tools index (e.g., search_tools.md) resolve correctly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix required parameter badges by reading JSON Schema `required` array
from parent level instead of per-property boolean (was always undefined)
- Remove stale category/categoryLabel fields from meta-tools.json
- Align meta.json sidebar order with generator script (alphabetical)
- Remove examples display from meta tool detail component
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add a programmatic Meta Tools reference under Reference > Meta Tools,
powered by data fetched from the Tool Router API.
- Generator script fetches tool schemas from API, produces JSON + MDX
- CI auto-updates via docs-update-data.yml on Apollo deploys
- Individual tool pages show tags, input parameters, and response schemas
- .md endpoint renders full parameter details for LLM consumers
- Updated existing docs to include COMPOSIO_GET_TOOL_SCHEMAS
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Surface the `composioManagedAuthSchemes` field from the API on toolkit
pages so users know upfront whether they can use Composio's managed
OAuth or need to provide their own credentials.
- Add `composioManagedAuthSchemes` to Toolkit type and generate script
- Show badge next to Authentication Details heading (OAuth toolkits only)
- Include managed app status in markdown/LLM export and toolkits index
- Regenerate toolkits.json with managed auth data (114/980 toolkits)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Stripe-inspired two-column layout with client-side filtering.
Markdown converter handles GlossaryTerm→heading conversion for
LLM-friendly output. Added glossary link to LLM footer, search
shortcuts, and CLAUDE.md documentation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Restore api: '/api/search' in search options (single source of truth)
- CustomSearchDialog accepts api prop from options spread
- Remove unused isEmpty variable (TS can't narrow through intermediates)
- Keep options spread approach (verified: SearchProvider line 52 does ...options)
- Type cast needed because RootProvider types options more narrowly than
SearchProvider actually consumes them
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Custom search dialog shows quick-access links (Quickstart, Authentication,
Configuring Sessions, General FAQs, Troubleshooting) with subtitles when
search is empty. Titles and descriptions are derived from MDX page
frontmatter at build time. Adds "Ask AI" button inside dialog content.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Switch search indexes from sync array to async function so OpenAPI-generated
API reference pages can be loaded via openapiSource(). Fix readonly type
error from `as const` on structuredData empty arrays.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Multiple changelog entries can share the same date. Append title to
the ID to avoid collisions in the search index.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Reference MDX pages (SDK reference, errors, rate-limits) now searchable
- Changelog entries now searchable by title
- Note: OpenAPI-generated API reference pages require async loading and
can't be indexed in the sync search route
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Toolkit pages generated from toolkits.json were not searchable because
the search API only indexed Fumadocs MDX pages. Now loads toolkit data
via getAllToolkitsSync() and adds entries for each toolkit that doesn't
already have an MDX page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Moves FAQ markdown files from content/toolkit-faq/ into
content/toolkits/faq/ so they live alongside other toolkit content.
The link checker now scans all .md files under content/ generically
instead of special-casing the FAQ directory.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Invisible instructions appended to every .md endpoint that steer AI code
generators toward the session-based pattern (composio.create + session.tools)
and provide correct direct execution patterns on tagged pages.
- Session guardrails (default): correct pattern, ALWAYS/NEVER/DISCOURAGED rules
- Direct execution guardrails: auth link flow, tool execute flow, key rules
- Frontmatter-scoped via llmGuardrails field (Zod-validated)
- llms-full.txt prepends guardrails once at top, not per-page
- 12 MDX pages tagged with llmGuardrails: "direct-execution"
- Remove dead /cookbooks path check from nav components
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Also fixes the detail page and llms.mdx route, which fetch tools
at runtime and were missing the same parameter.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The 6.9 MB toolkits.json was re-read and re-parsed on every detail
page request. Centralise all reading into lib/toolkit-data.ts with a
module-level Map cache so the file is parsed once per process lifetime.
Also drops category from toolkits-list.json (unused by landing page).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The sitemap was using the sync referenceSource which only included
MDX pages. Switch to async getReferenceSource() to also include
OpenAPI-generated API endpoint pages.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wrap the fumadocs Accordion component to auto-generate an id from the
title prop, so every accordion gets a copy-link button and can be
deep-linked via URL hash. The link icon is hidden by default and shown
on hover.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add nodeText() helper that only converts string/number ReactNode
values, returning null for React elements to avoid [object Object]
headings. Also fix missing closing brace in switch case.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Empty strings were being removed by filter(Boolean). Switch to
join + collapse to preserve intentional blank lines around headings.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Separators are section headers (##), folders are sub-sections within
them (###), matching the sidebar hierarchy.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
walkPageTree was only emitting headings for separator nodes, causing
folder sections (Providers, Troubleshooting, etc.) to collapse into
flat URL lists without section headings.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>