---
title: "Adapters"
description: "The lowest-level path is the standard handler, initDevframe(def, { base }): a Web Standard (request: Request) => Promise<Response> for any catch-all route. Every path below builds on it."
canonical_url: "https://devfra.me/adapters"
---
# Adapters

> The lowest-level path is the standard handler, initDevframe(def, \{ base }): a Web Standard (request: Request) => Promise\<Response> for any catch-all route. Every path below builds on it.

The lowest-level path is [the standard handler](https://devfra.me/adapters/initiate), `initDevframe(def, { base })`: a Web Standard `(request: Request) => Promise<Response>` for any catch-all route. Every path below builds on it.

Adapters wrap it as `createXxx(def, options?)` at `devframe/adapters/<name>`. `cac` needs an optional peer ([`cac`](https://github.com/cacjs/cac)).

## Comparison

| Entry point                                             | Module                       | Factory                        | Best for         |
| ------------------------------------------------------- | ---------------------------- | ------------------------------ | ---------------- |
| [Standard Handler](https://devfra.me/adapters/initiate) | `devframe/initiate`          | `initDevframe(def, { base })`  | Raw handler      |
| [`cac`](https://devfra.me/adapters/cac)                 | `devframe/adapters/cac`      | `createCac()`                  | Standalone tools |
| [`dev`](https://devfra.me/adapters/dev)                 | `devframe/adapters/dev`      | `createDevServer()`            | Dev server       |
| [`build`](https://devfra.me/adapters/build)             | `devframe/adapters/build`    | `createBuild()`                | Static snapshots |
| [`vite`](https://devfra.me/adapters/vite)               | `@vitejs/devtools-kit/node`  | `createPluginFromDevframe()`   | Vite DevTools    |
| [`embedded`](https://devfra.me/adapters/embedded)       | `devframe/adapters/embedded` | `createEmbedded(def, { ctx })` | Runtime          |
| [`mcp`](https://devfra.me/adapters/mcp)                 | `devframe/adapters/mcp`      | `createMcpServer()`            | Coding agents    |

## Mount paths

SPA basePath depends on the adapter:

| Adapter kind                | Default basePath | Reason                            |
| --------------------------- | ---------------- | --------------------------------- |
| `cli`, `build` (standalone) | `/`              | Owns the origin.                  |
| `vite`, `embedded` (hosted) | `/__<id>/`       | Shares a host framework's origin. |

Override with `DevframeDefinition.basePath`:

```ts
defineDevframe({
  id: 'my-tool',
  basePath: '/devframes/', // force this base regardless of adapter
  setup(ctx) { /* … */ },
})
```

The SPA discovers its base at runtime; see [Client](https://devfra.me/guide/client#runtime-basepath-discovery).


## Sitemap

See the full [sitemap](https://devfra.me/sitemap.md) for all pages.
