# Extension points — remix-run/remix

> Canonical page: https://codevetter.com/unpack/remix/extension-points

# Extension points — remix-run/remix

Scanned commit 27bd7a4401594ec1acbe30ee3937518832270a30 (2026-10-01). Generated by codevetter codevetter 1.15.0 on 2026-10-02.

Source inspection; upstream code and tests were not executed.

Composition is the main extension mechanism: factories, middleware, route installers, renderers, provider runtimes, and storage interfaces connect focused modules. The umbrella alias manifest controls public distribution wiring. CLI features use explicit command dispatch and structured JSON configuration. Browser extension hooks carry their own trust responsibilities.
- Add umbrella aliases through packages/remix/manifest.json and its generator; the manifest explicitly excludes @remix-run/ui from automatic umbrella inclusion. — [packages/remix/manifest.json#L1-18](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/remix/manifest.json#L1-L18) [scripts/generate-remix.ts#L1-7](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/scripts/generate-remix.ts#L1-L7)
- RouterOptions exposes matcher, defaultHandler, and middleware replacement points, with createMultiMatcher as the default matcher. — [packages/fetch-router/src/lib/router.ts#L210-231](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/fetch-router/src/lib/router.ts#L210-L231) [packages/fetch-router/src/lib/router.ts#L368-370](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/fetch-router/src/lib/router.ts#L368-L370)
- RouteInstaller receives a RouteBuilder; mount joins route prefixes and invokes the installer on a child builder. — [packages/fetch-router/src/lib/router.ts#L191-195](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/fetch-router/src/lib/router.ts#L191-L195) [packages/fetch-router/src/lib/router.ts#L567-575](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/fetch-router/src/lib/router.ts#L567-L575)
- Controllers and actions can carry middleware; mapController merges controller middleware with each action's middleware before registration. — [packages/fetch-router/src/lib/router.ts#L489-527](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/fetch-router/src/lib/router.ts#L489-L527)
- Applications augment remix.RouterTypes.context using middleware-derived context; the template and bookstore demonstrate that typed integration. — [template/app/router.ts#L9-15](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/template/app/router.ts#L9-L15) [demos/bookstore/app/router.ts#L41-55](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/demos/bookstore/app/router.ts#L41-L55)
- renderWith accepts a per-request renderer factory, allowing custom input/output rendering while keeping the same context.render/context-key integration. — [packages/render-middleware/src/lib/render.ts#L6-15](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/render-middleware/src/lib/render.ts#L6-L15) [packages/render-middleware/src/lib/render.ts#L28-41](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/render-middleware/src/lib/render.ts#L28-L41)
- run accepts a required module loader, an optional frame resolver, and optional client-entry preload processing; default frame behavior can be replaced. — [packages/component/src/runtime/run.ts#L15-36](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/component/src/runtime/run.ts#L15-L36) [packages/component/src/runtime/run.ts#L145-160](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/component/src/runtime/run.ts#L145-L160)
- createOAuthProvider binds a stable name to createAuthorizationURL, handleCallback, and optional refreshTokens hooks, with normalized profile/account/token result types. — [packages/auth/src/lib/provider.ts#L34-46](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/auth/src/lib/provider.ts#L34-L46) [packages/auth/src/lib/provider.ts#L91-104](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/auth/src/lib/provider.ts#L91-L104) [packages/auth/src/lib/provider.ts#L145-156](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/auth/src/lib/provider.ts#L145-L156)
- SessionStorage is the backend contract; read returns a Session and save returns a cookie value, null for no update, or an empty string for destruction. — [packages/session/src/lib/session-storage.ts#L10-27](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/session/src/lib/session-storage.ts#L10-L27)
- createBookstoreRouter accepts injected Cookie and SessionStorage values, and createGitHubAuthController accepts an injected provider registry. — [demos/bookstore/app/router.ts#L58-65](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/demos/bookstore/app/router.ts#L58-L65) [demos/social-auth/app/actions/auth/github/controller.ts#L16-19](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/demos/social-auth/app/actions/auth/github/controller.ts#L16-L19)
- The CLI extends through runCommand's explicit lazy-import branches and RemixConfig's assets/db/doctor/test sections; config parsing rejects unknown top-level properties. — [packages/cli/src/lib/cli.ts#L96-133](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/cli/src/lib/cli.ts#L96-L133) [packages/cli/src/lib/remix-config.ts#L29-37](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/cli/src/lib/remix-config.ts#L29-L37) [packages/cli/src/lib/remix-config.ts#L200-207](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/cli/src/lib/remix-config.ts#L200-L207)
- The asset server receives loader and HMR configuration; the template installs componentHmr() and a lazily supplied browser HMR channel. — [packages/assets/src/lib/asset-server.ts#L436-466](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/packages/assets/src/lib/asset-server.ts#L436-L466) [template/app/assets.ts#L25-31](https://github.com/remix-run/remix/blob/27bd7a4401594ec1acbe30ee3937518832270a30/template/app/assets.ts#L25-L31)

Every claim links to its cited files at the pinned commit. Citations identify source evidence; they do not establish runtime correctness. Independent CodeVetter scan — not reviewed by upstream maintainers.

## Public product links

- [CodeVetter](https://codevetter.com/)
- [Download](https://codevetter.com/download)
- [Documentation](https://codevetter.com/docs/)
- [Source](https://github.com/Codevetter/codevetter)
