3 months free, then 50% off for 12 months. For TypeScript polyrepo teams. Apply to see if you qualify. Apply now

Know the whole codebase before you change it.

Carrick builds one index of every service, type and contract in your TypeScript repos, from source, on every merge.

It resolves request and response types across service boundaries, maps every function to what it does, checks pull requests before they merge, and reaches you in your editor and in your agents.

1.0Install
Live in three steps Quickstart
  1. 01 Sign in with GitHub
  2. 02 Install the GitHub App on your repos
  3. 03 Add Carrick to your Actions workflows
No new infrastructure. No changes to your application code.

Cross-boundary type safety

The compiler's type safety stops at the repo boundary. It can't see the service on the other side of a fetch. Carrick resolves request and response types across that boundary, mapping routing topology and middleware chains, so contract drift surfaces without a dedicated test suite.

2.0Type mapDocs
2.1Routing topology 2.2Middleware chains

Grep by meaning, not by name

About half the time an agent completes a task, it has quietly rewritten something the codebase already had. Grep only finds the name it guessed. Carrick maps every function to its intent, so agents find the implementation that exists and build on it.

3.0Semantic searchDocs
3.1Vector embeddings 3.2MCP tools

Catch contract drift in the pull request

The same index your agent uses runs in CI. When a producer and consumer drift apart, whichever protocol they speak, Carrick flags the mismatch in the PR before it merges. It also flags functions duplicated across repos and dependency version conflicts.

4.0CI checksDocs
4.1Contract drift 4.2Duplicate functions 4.3Version conflicts

Go to definition, across the repo boundary

The same index, inside the editor. Go to definition jumps from an indexed call to its handler when the other repo is on disk. A route's code lens lists the counterpart call sites held in the local index. Type disagreements appear as diagnostics on the indexed route or call.

5.0EditorDocs
1 producer · 1 mismatch
18const res = await fetch("/orders/summary")
19const body = await res.json()
20const total: number = body.total
Definition orders-api / src/routes/orders.ts:41
4 consumers, 1 mismatch
41router.get("/orders/summary", async (req, res) => {
42  res.json({ total: total.toFixed(2) })
Problems 2 Output Terminal
order.tscheckout/src1
GET /orders/summary type_mismatch: total: string not assignable to numbercarrick(type_mismatch)[Ln 18, Col 1]
Read off the fetch literal, consumer in checkout.
Counterparts: producer in orders-api, orders.ts:41
orders.tsorders-api/src/routes1
GET /orders/summary type_mismatch: response total: string, read as numbercarrick(type_mismatch)[Ln 41, Col 1]
Read off the route handler, producer in orders-api.
Counterparts: consumer in checkout, order.ts:18
checkout a1b2c3d VS Code Cursor Windsurf

Ships with the CLI. The extension is available from Visual Studio Marketplace and Open VSX. Other LSP clients can start the same server directly.

5.1Diagnostics 5.2Go to definition 5.3Code lens

The workspace

Every service, type and contract in one index, browsable in the dashboard and served to your agents over MCP.

6.0Workspace
7.0Blog

Notes from the boundary

How Many Endpoints Does It Take to Ask 'How Was Your Experience?'
The survey is six endpoints. The product is 167.
Introducing Carrick
The context layer for polyrepo TypeScript teams
Benchmarking LLM Structured Outputs
Three Providers, Three Symmetric Ways They Break
View all posts →
8.0FAQ

Common questions

Carrick reads your TypeScript source and builds one index of every service: its routes, the real request and response types, and a one-line description of what each function does. The index is built in CI on every merge, and the CLI builds a local index in your workspace. Your coding agent queries the hosted index over MCP, while the editor reads the local index for diagnostics, code lenses and go to definition.

Grep finds the name you guessed, while Carrick matches on what a function does. The agent can find an existing implementation even when it is named something else in another repo.

Yes. Carrick derives services from workspace manifests and shows the proposal during init. An existing carrick.json can specify service folders and shared source. Each service is indexed separately so Carrick can check the contracts between them.

Agents that support MCP can connect to Carrick, including Claude Code, Cursor, Windsurf and Codex. The editor extension is available from Visual Studio Marketplace and Open VSX, and other LSP clients can start the same server directly.

TypeScript source and an existing package or Deno manifest. Carrick prepares dependencies without running lifecycle scripts. Deno projects also need Deno on PATH; Carrick reads their configuration without a separate TypeScript config. The coverage guide lists supported runtime scopes and any dependency preparation your project needs.

Carrick reads source to build an index of route signatures, resolved types, dependencies and function descriptions. Access to that index is scoped to your workspace, and stored index data is encrypted at rest.

TypeScript today. Other languages will follow once the TypeScript tooling is where we want it.

Free for up to 10 repositories, no card needed. Above that it is €299 a month for up to 25 repositories, and a custom price beyond. Every plan is the whole product with unlimited queries. A limited number of teams can apply for three months free, then 50% off for the following twelve.

Direct support, usually the same day. Bug reports and feature requests go to the engineers who build Carrick, with no queue in between.

One index of your whole system. Every service, type and contract, served to agents over MCP and checked in CI.

Get started now Apply to get 3 months free Free for up to 10 repositories