Skip to content

Unprefixed import.meta.env variables are undefined on the server side #13526

Closed
@nikolailehbrink

Description

@nikolailehbrink

I'm using React Router as a...

framework

Reproduction

https://stackblitz.com/edit/github-wcjbsndz?file=app%2Froutes%2Fhome.tsx

System Info

System:
    OS: Windows 11 10.0.26100
    CPU: (16) x64 AMD Ryzen 7 5800X 8-Core Processor
    Memory: 50.57 GB / 63.93 GB
  Binaries:
    Node: 22.14.0 - C:\nvm4w\nodejs\node.EXE
    npm: 10.9.2 - C:\nvm4w\nodejs\npm.CMD
    pnpm: 9.5.0 - ~\AppData\Local\pnpm\pnpm.EXE
  Browsers:
    Edge: Chromium (133.0.3065.59)
    Internet Explorer: 11.0.26100.1882
  npmPackages:
    @react-router/dev: ^7.5.3 => 7.5.3
    @react-router/node: ^7.5.3 => 7.5.3
    @react-router/serve: ^7.5.3 => 7.5.3
    react-router: ^7.5.3 => 7.5.3
    vite: ^6.3.3 => 6.3.4

Used Package Manager

pnpm

Expected Behavior

import.meta.env should be available server-side in the same way it is in other Vite-powered frameworks like Astro.
For example, Astro supports this pattern:

// When import.meta.env.SSR === true
const data = await db(import.meta.env.DB_PASSWORD);

// When import.meta.env.SSR === false
const data = fetch(`${import.meta.env.PUBLIC_POKEAPI}/pokemon/squirtle`);

Reference: Astro Environment Variables Docs

I expect similar server-side access via import.meta.env in React Router v7, without falling back to process.env.

Actual Behavior

When trying to access import.meta.env.OPENAI_API_KEY inside a server-side loader() function, the value is always undefined.
However, accessing the same variable with process.env.OPENAI_API_KEY works correctly.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions