`composio --version` goes from 288ms to 199ms, peak RSS from 97.8MB to 77.3MB, and the executable from 85.9MB to 79.7MB. Every command benefits. A compiled Bun binary parses its whole embedded bundle before the first line of JavaScript runs, and #4468 had already made sure the TypeScript compiler and the tokenizer rank table were never *evaluated* unless `generate`, `run`, or a large `execute` response needed them. They were still *parsed* on every start: the compiler alone was 44% of the executable's JavaScript and the o200k rank table another 28%, so `--version` spent ~75ms reading code it could never call. Both now ship as companion modules next to the executable, through the mechanism `composio run` already uses for its own runtime helpers: - `generation-runtime.mjs` carries `src/generation/*`, the `composio run` source rewrites, `typescript`, `@composio/ts-builders` and `openapi-typescript`. `generate ts`, `generate py` and `run` load it with `loadInstalledCompanionModule`; from a source checkout the loader resolves the `.ts` next to `run-companion-modules.ts` instead, so tests and `bun run src/bin.ts` need no build step. - `execute-output-encoder-runtime.mjs` carries `js-tiktoken/lite` and the rank table. `execute` loads it only once a response exceeds the 10KB byte pre-filter. A companion bundles its own copy of `effect`, and a fiber cannot run primitives built by another copy of the runtime, so nothing Effect-shaped crosses the boundary: the generation companion exposes plain functions and promises, runs its pipelines on its own runtime, and returns failures as values that `src/generation/errors.ts` rebuilds as the CLI's own error classes, stack included. Generated output is byte-identical to #4468 for `generate ts`, `generate ts --transpiled` and `generate py`. Both modules join `RUN_COMPANION_MODULE_BASENAMES`, so the build, release packaging, install verification, `upgrade` and the self-repair download pick them up unchanged. The three hand-maintained uninstall lists and the upgrade E2E fixture gain the two file names. Two smaller startup costs go with it: - `src/constants.ts` imported `constants` from `@composio/core`'s root entry for two strings and two URLs, which evaluated the whole SDK at startup (~25ms of module-scope work, mostly zod schemas). The four values are spelled out and pinned to core's by a test. - `tool-file-uploads.ts` imported three core helpers at module scope that only a file upload reaches; they are imported on that path now. The binary build gains a guard: after bundling the companions it bundles `src/bin.ts` once more unminified and fails if the executable's graph reaches `typescript`, `js-tiktoken`, core's root entry, `src/generation/*` or a companion entry. Without it a stray static import would put the compiler back into the executable with nothing to notice. Building also surfaced that `assertBundledRuntimeFiles` blanked string literals to same-length runs of spaces, which made the import patterns' `^\s*` backtrack quadratically across the compiler's multi-megabyte embedded lib strings and stalled the build for over ten minutes. String bodies are dropped now. (The check itself has never matched a specifier, since the specifiers it looks for are the string literals it removes; that is left as it was.) Measured on the pinned toolchain, Bun 1.4.1+4661e494f, linux-x64, best of 15, telemetry disabled, both binaries built in the same session: composio --version 288ms -> 199ms tools execute --help 287ms -> 202ms peak RSS 97.8MB -> 77.3MB executable 85.9MB -> 79.7MB executable JavaScript 8.3MB -> 2.1MB (minified) The `execute` tail after `execute.tool_call.end` is unchanged for responses under 10KB (~10ms) and ~20ms slower above it (351 -> 374ms), which is the on-demand parse of the 2.2MB encoder companion. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Wx9gEjuiHux2weiHjdNcDs
Composio Docs
Documentation site for Composio, built with Fumadocs.
For issue triage, review, validation, and publication, follow Change the Composio docs.
Getting Started
bun install
bun run dev
Open http://localhost:3000.
Project Structure
docs/
├── app/ # Next.js app router
├── content/ # MDX content
│ ├── docs/
│ ├── examples/
│ ├── changelog/
│ └── reference/
├── components/ # React components
├── lib/ # Utilities
└── public/ # Static assets
Adding Content
Create an .mdx file in content/, add frontmatter, then add to meta.json:
---
title: Page Title
description: Brief description
---
Content here...
Components
<Tabs items={['Python', 'TypeScript']}>
<Tab value="Python">...</Tab>
<Tab value="TypeScript">...</Tab>
</Tabs>
<Callout type="info">Note</Callout>
<Cards>
<Card title="Title" href="/path" />
</Cards>
Sidebar
Each folder has meta.json for ordering:
{
"pages": ["page-one", "page-two"]
}
TypeScript Code Blocks
All TypeScript code blocks in MDX files are type-checked at build time using Twoslash. This ensures docs stay in sync with the SDK.
- Use
// @noErrorsto skip checking for partial snippets - Use
// ---cut---to hide setup code from output - Run
bun run buildlocally to validate before pushing
See the Twoslash guide for complete example patterns and troubleshooting.
Search
Docs search uses Algolia when NEXT_PUBLIC_ALGOLIA_SEARCH_API_KEY is set; otherwise it falls back to the local Fumadocs /api/search endpoint for development and tests. The sync script builds a first-party index from MDX/OpenAPI/toolkit data (no crawler required), splits long pages into section-sized records, configures searchable attributes/custom ranking/distinct, requests clickAnalytics, and sends search result view/click events with search-insights.
NEXT_PUBLIC_ALGOLIA_APP_ID=62HI9PQZ1L # optional; default shown
NEXT_PUBLIC_ALGOLIA_SEARCH_API_KEY=...
NEXT_PUBLIC_ALGOLIA_INDEX_NAME=docs_composio # optional; default shown
Sync the Algolia index with an admin key:
ALGOLIA_APP_ID=62HI9PQZ1L
ALGOLIA_ADMIN_API_KEY=...
ALGOLIA_INDEX_NAME=docs_composio bun run sync:search
Preview the generated records or test live relevance:
bun run sync:search --dry-run --samples
ALGOLIA_SEARCH_API_KEY=... bun run test:search "oauth auth config" "gmail send email"
Commands
| Command | Description |
|---|---|
bun run dev |
Dev server |
bun run build |
Production build (validates TS code blocks) |
bun run types:check |
Type check |
bun run sync:search |
Sync docs search records to Algolia |
bun run test:search |
Query the configured Algolia index from the terminal |