Skip to content

Platform Presets

Presets are pre-built environment schemas for common deployment platforms. Instead of manually defining every VERCEL_ENV, RAILWAY_SERVICE_NAME, or NETLIFY variable, you pass a preset and get validated, typed access to all platform-injected variables.

Usage

ts
import { defineEnv } from '@vite-env/core'
import { vercel } from '@vite-env/core/presets'
import { z } from 'zod'

export default defineEnv({
  presets: [vercel],
  server: {
    DATABASE_URL: z.url(),
  },
  client: {
    VITE_API_URL: z.url(),
  },
})

The preset's variables are merged into server and client alongside your own definitions. Your definitions always take precedence over preset values.

Available Presets

Vercel

ts
import { vercel } from '@vite-env/core/presets'

Covers all Vercel system environment variables:

VariableTypeRequired
VERCEL'1'Yes
VERCEL_ENV'production' | 'preview' | 'development'Yes
VERCEL_URLstringYes
VERCEL_PROJECT_PRODUCTION_URLstringYes
VERCEL_DEPLOYMENT_IDstringYes
VERCEL_BRANCH_URLstringNo
VERCEL_REGIONstringNo
VERCEL_GIT_PROVIDERstringNo
VERCEL_GIT_REPO_SLUGstringNo
VERCEL_GIT_REPO_OWNERstringNo
VERCEL_GIT_COMMIT_REFstringNo
VERCEL_GIT_COMMIT_SHAstringNo
VERCEL_GIT_COMMIT_MESSAGEstringNo
VERCEL_GIT_COMMIT_AUTHOR_LOGINstringNo
VERCEL_GIT_PULL_REQUEST_IDstringNo
VERCEL_SKEW_PROTECTION_ENABLED'1'No

TIP

VERCEL_URL is a bare hostname (e.g. myapp-abc123.vercel.app), not a full URL. The preset uses z.string().min(1) instead of z.url().

Railway

ts
import { railway } from '@vite-env/core/presets'

Covers Railway service variables:

VariableTypeRequired
RAILWAY_ENVIRONMENT_IDstringYes
RAILWAY_ENVIRONMENT_NAMEstringYes
RAILWAY_SERVICE_IDstringYes
RAILWAY_SERVICE_NAMEstringYes
RAILWAY_PROJECT_IDstringYes
RAILWAY_PROJECT_NAMEstringYes
RAILWAY_DEPLOYMENT_IDstringYes
RAILWAY_REPLICA_IDstringNo
RAILWAY_GIT_COMMIT_SHAstringNo
RAILWAY_GIT_BRANCHstringNo
RAILWAY_GIT_REPO_NAMEstringNo
RAILWAY_GIT_REPO_OWNERstringNo
RAILWAY_PUBLIC_DOMAINstringNo
RAILWAY_PRIVATE_DOMAINstringNo
RAILWAY_TCP_PROXY_DOMAINstringNo
RAILWAY_TCP_PROXY_PORTnumberNo

INFO

PORT is intentionally excluded. It's a generic name set by many tools — handle it in your own server config.

Netlify

ts
import { netlify } from '@vite-env/core/presets'

Covers Netlify build environment variables:

VariableTypeRequired
NETLIFY'true'Yes
BUILD_IDstringYes
CONTEXT'production' | 'deploy-preview' | 'branch-deploy' | 'dev'Yes
DEPLOY_IDstringYes
DEPLOY_URLurlYes
DEPLOY_PRIME_URLurlYes
URLurlYes
BRANCHstringYes
COMMIT_REFstringYes
PULL_REQUEST'true'No
REVIEW_IDstringNo
REPOSITORY_URLurlNo
INCOMING_HOOK_TITLEstringNo
INCOMING_HOOK_URLurlNo

TIP

Unlike Vercel, Netlify URLs (DEPLOY_URL, URL, etc.) are full https:// URLs, so the preset validates them with z.url().

How Merging Works

Presets are merged in order, then your definitions are applied on top:

txt
preset 1 → preset 2 → … → your server/client
  • If multiple presets define the same key, the last preset wins (with a console warning).
  • If a preset and your own config define the same key, your definition wins (with a console warning).

This means you can always override a preset's schema for a variable if you need a different validation rule.

Combining Presets

You can use multiple presets if your app deploys to different platforms or you want to layer concerns:

ts
export default defineEnv({
  presets: [vercel, railway],
  server: {
    DATABASE_URL: z.url(),
  },
})

The EnvPreset Type

Presets use the EnvPreset type, which has the same shape as EnvDefinition:

ts
interface EnvPreset {
  server?: z.ZodRawShape
  client?: z.ZodRawShape
}

You can create custom presets for your own infrastructure:

ts
import type { EnvPreset } from '@vite-env/core'
import { z } from 'zod'

export const myInfra = {
  server: {
    MY_SERVICE_URL: z.url(),
    MY_SERVICE_TOKEN: z.string().min(1),
  },
} satisfies EnvPreset

Released under the MIT License.

⚠️ You're reading unreleased (next) docs. Latest stable: v0.5.0 →