prefer-env-schema
Define an Astro env schema for variables documented in .env.example.
astro-doctor/prefer-env-schema
Why it matters
An env schema validates required variables at startup and generates TypeScript types for server and client imports. Without one, documented variables can be missing, malformed, or used under the wrong name without an early error.
See the difference
Incorrect
Documented variables without a schema
# .env.example
DATABASE_URL=
PUBLIC_API_URL=Correct
Validate documented variables in astro.config.ts
import { defineConfig, envField } from 'astro/config'
export default defineConfig({
env: {
schema: {
DATABASE_URL: envField.string({ context: 'server', access: 'secret' }),
PUBLIC_API_URL: envField.string({ context: 'client', access: 'public' }),
},
},
})Configure this check
Project audits are configured in doctor.config.ts:
export default {
rules: {
'astro-doctor/prefer-env-schema': 'error',
},
}Use 'error', 'warn', or 'off'. The configuration guide covers presets and per-file overrides.
Keep exploring best practices
- prefer-class-listUse class:list directive for conditional or dynamic class names.
- no-process-envDisallow process.env in Astro files — use import.meta.env instead.
- prefer-content-collectionsPrefer Content Collections over Astro.glob() or import.meta.glob() for Markdown and MDX files.
- no-legacy-astro-7-experimental-flagsMigrate experimental configuration fields removed or stabilized in Astro 7.
- prefer-pnpmUse pnpm consistently and remove competing package-manager lockfiles.
- require-client-router-script-lifecycleInitialize scripts on astro:page-load when using ClientRouter.
- require-content-configAdd a content config when src/content contains entries.
- require-fetch-default-exportRequire a default export from Astro 7 advanced-routing entrypoints.