# Extension points — keystonejs/keystone

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

# Extension points — keystonejs/keystone

Scanned commit 1a8f2b7fae39ea5dac415745caea4f766109e669 (2026-09-14). Generated by codevetter codevetter 1.15.0 on 2026-10-02.

Source inspection; upstream code and tests were not executed.

Keystone extensions are primarily configuration callbacks and typed factories rather than a central plugin registry. Lists, fields, hooks, actions, schema extensions, sessions, and storage strategies feed into generated runtime and UI structures. Transport and Admin UI generation expose additional integration boundaries.
- Custom fields plug in as FieldTypeFunc factories receiving provider/list/field metadata; their result supplies database shape, input/output resolvers, access, hooks, views, and Admin metadata. — [packages/core/src/lib/core/initialise-lists.ts#L150-201](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/lib/core/initialise-lists.ts#L150-L201) [packages/core/src/lib/core/initialise-lists.ts#L765-805](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/lib/core/initialise-lists.ts#L765-L805) [packages/core/src/fields/types/file/index.ts#L113-153](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/fields/types/file/index.ts#L113-L153)
- graphql.extendGraphqlSchema() receives the generated schema after core query/mutation assembly; createAuth() composes its authentication extension before the application's existing extension. — [packages/core/src/lib/graphql.ts#L59-82](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/lib/graphql.ts#L59-L82) [packages/auth/src/index.ts#L194-212](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/auth/src/index.ts#L194-L212)
- list.actions entries are initialized into GraphQL argument types, singular/plural operation names, telemetry labels, and UI prompt/navigation metadata; field-rendered arguments cannot suppress the item prompt. — [packages/core/src/lib/core/initialise-lists.ts#L1252-1274](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/lib/core/initialise-lists.ts#L1252-L1274) [packages/core/src/lib/core/initialise-lists.ts#L1275-1300](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/lib/core/initialise-lists.ts#L1275-L1300) [packages/core/src/schema.ts#L245-259](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/schema.ts#L245-L259)
- Field and list resolveInput hooks transform data in that order; validation and beforeOperation/afterOperation hooks provide separate lifecycle stages around CRUD persistence. — [packages/core/src/lib/core/mutations/index.ts#L526-576](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/lib/core/mutations/index.ts#L526-L576) [packages/core/src/lib/core/mutations/index.ts#L597-619](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/lib/core/mutations/index.ts#L597-L619)
- Database customization uses prismaClientOptions(), extendPrismaClient(), extendPrismaSchema(), and onConnect(); getKeystone() also accepts an existing Prisma client. — [packages/core/src/schema.ts#L150-158](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/schema.ts#L150-L158) [packages/core/src/lib/getContext.ts#L92-115](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/lib/getContext.ts#L92-L115)
- Session strategies implement get/start/end, storedSessions accepts a store factory parameterized by maxAge, and asset StorageStrategy delegates put/delete/url with access to the Keystone context. — [packages/core/src/session.ts#L88-135](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/session.ts#L88-L135) [packages/core/src/session.ts#L138-167](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/session.ts#L138-L167) [packages/core/src/fields/types/file/index.ts#L65-80](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/fields/types/file/index.ts#L65-L80) [packages/core/src/fields/types/file/index.ts#L139-148](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/fields/types/file/index.ts#L139-L148)
- Admin UI generation accepts ui.getAdditionalFiles() and discovers admin/pages files; additional files take precedence, and custom pages override matching generated pages. — [packages/core/src/admin-ui/system/generateAdminUI.ts#L78-128](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/admin-ui/system/generateAdminUI.ts#L78-L128)
- server.extendExpressApp() and extendHttpServer() run before Apollo middleware registration; document consumers separately extend editing through componentBlocks and DocumentFeatures without exposing Slate as the public customization contract. — [packages/core/src/lib/express.ts#L61-100](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/core/src/lib/express.ts#L61-L100) [packages/fields-document/src/index.ts#L71-82](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/fields-document/src/index.ts#L71-L82) [packages/fields-document/ARCHITECTURE.md#L69-80](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/fields-document/ARCHITECTURE.md#L69-L80) [packages/fields-document/ARCHITECTURE.md#L103-105](https://github.com/keystonejs/keystone/blob/1a8f2b7fae39ea5dac415745caea4f766109e669/packages/fields-document/ARCHITECTURE.md#L103-L105)

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)
