--- title: Creating an Adapter description: Create an adapter module that implements the `NextAdapter` interface. --- An adapter is a module that exports an object implementing the `NextAdapter` interface. The interface can be imported from the `next` package: ```typescript import type { NextAdapter } from 'next' ``` The interface is defined as follows: ```typescript type Route = { source?: string sourceRegex: string destination?: string headers?: Record has?: RouteHas[] missing?: RouteHas[] status?: number priority?: boolean } export interface AdapterOutputs { pages: Array middleware?: AdapterOutput['MIDDLEWARE'] appPages: Array pagesApi: Array appRoutes: Array prerenders: Array staticFiles: Array } export interface NextAdapter { name: string modifyConfig?: ( config: NextConfigComplete, ctx: { phase: PHASE_TYPE nextVersion: string } ) => Promise | NextConfigComplete onBuildComplete?: (ctx: { routing: { beforeMiddleware: Array beforeFiles: Array afterFiles: Array dynamicRoutes: Array onMatch: Array fallback: Array shouldNormalizeNextData: boolean rsc: RoutesManifest['rsc'] } outputs: AdapterOutputs projectDir: string repoRoot: string distDir: string config: NextConfigComplete nextVersion: string buildId: string }) => Promise | void } ``` ## Basic Adapter Structure Here's a minimal adapter example: ```js filename="my-adapter.js" /** @type {import('next').NextAdapter} */ const adapter = { name: 'my-custom-adapter', async modifyConfig(config, { phase }) { // Modify the Next.js config based on the build phase if (phase === 'phase-production-build') { return { ...config, // Add your modifications } } return config }, async onBuildComplete({ routing, outputs, projectDir, repoRoot, distDir, config, nextVersion, buildId, }) { // Process the build output console.log('Build completed with', outputs.pages.length, 'pages') console.log('Build ID:', buildId) console.log('Dynamic routes:', routing.dynamicRoutes.length) // Access emitted output entries for (const page of outputs.pages) { console.log('Page:', page.pathname, 'at', page.filePath) } for (const apiRoute of outputs.pagesApi) { console.log('API Route:', apiRoute.pathname, 'at', apiRoute.filePath) } for (const appPage of outputs.appPages) { console.log('App Page:', appPage.pathname, 'at', appPage.filePath) } for (const prerender of outputs.prerenders) { console.log('Prerendered:', prerender.pathname) } }, } module.exports = adapter ```