How this skill is triggered — by the user, by Claude, or both
Slash command
/infra-config-setup-env:infra-config-setup-envThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> **Quick Guide:** Per-app .env files. Framework-specific prefixes (`NEXT_PUBLIC_*` for Next.js, `VITE_*` for Vite). Zod validation at startup. Maintain .env.example templates. Never commit secrets (.gitignore). Environment-based feature flags.
Quick Guide: Per-app .env files. Framework-specific prefixes (
NEXT_PUBLIC_*for Next.js,VITE_*for Vite). Zod validation at startup. Maintain .env.example templates. Never commit secrets (.gitignore). Environment-based feature flags.
<critical_requirements>
All code must follow project conventions in CLAUDE.md (kebab-case, named exports, import ordering,
import type, named constants)
(You MUST validate ALL environment variables with Zod at application startup)
(You MUST use framework-specific prefixes for client-side variables - NEXT_PUBLIC_* for Next.js, VITE_* for Vite)
(You MUST maintain .env.example templates with ALL required variables documented)
(You MUST never commit secrets to version control - use .env.local and CI secrets)
(You MUST use per-app .env files - NOT root-level .env files)
</critical_requirements>
Auto-detection: Environment variables, .env files, Zod validation, t3-env, @t3-oss/env, secrets management, NEXT_PUBLIC_ prefix, VITE_ prefix, feature flags, z.stringbool
When to use:
When NOT to use:
Key patterns covered:
NEXT_PUBLIC_* for client, VITE_* for Vite client)Detailed Resources:
Environment management follows the principle that configuration is code -- it should be validated, typed, and versioned. The system uses per-app .env files with framework-specific prefixes, Zod validation at startup, and strict security practices to prevent secret exposure.
Each app/package has its own .env file to prevent conflicts and clarify ownership.
apps/
├── client-next/
│ ├── .env # Local development (NEXT_PUBLIC_API_URL)
│ └── .env.production # Production overrides
├── client-react/
│ ├── .env # Local development
│ └── .env.production # Production overrides
└── server/
├── .env # Local server config
├── .env.example # Template for new developers
└── .env.local.example # Local overrides template
packages/
├── api/
│ └── .env # API package config
└── api-mocks/
└── .env # Mock server config
.env - Default development values (committed for apps, gitignored for sensitive packages).env.example - Documentation template (committed, shows all required variables).env.local - Local developer overrides (gitignored, takes precedence over .env).env.production - Production configuration (committed or in CI secrets).env.local.example - Local override template (committed)Next.js loading order (highest to lowest priority):
process.env (already set in environment).env.$(NODE_ENV).local (e.g., .env.production.local).env.local (not loaded when NODE_ENV=test).env.$(NODE_ENV) (e.g., .env.production).envVite loading order:
.env.[mode].local (e.g., .env.production.local).env.[mode] (e.g., .env.production).env.local.envException: Shared variables can go in your build tool's env configuration for cache invalidation
See examples/core.md for complete code examples.
Validate environment variables at application startup using Zod schemas. Define a schema, parse at startup, export a typed env object.
// lib/env.ts
const envSchema = z.object({
VITE_API_URL: z.string().url(),
VITE_API_TIMEOUT: z.coerce.number().default(DEFAULT_API_TIMEOUT_MS),
VITE_ENABLE_ANALYTICS: z.stringbool().default(false), // Zod 4+ (NOT z.coerce.boolean())
});
export const env = envSchema.parse(import.meta.env);
Key gotchas:
z.coerce.boolean() converts "false" to true (string is truthy) - always use z.stringbool() insteaderror.issues (not error.errors) for Zod 4 error handlingNote: For Next.js/Vite projects, consider T3 Env (
@t3-oss/env-nextjsor@t3-oss/env-core) for client/server variable separation and build-time validation. See examples/t3-env.md.
See examples/core.md for complete good/bad comparisons.
Use framework-specific prefixes for client-side variables and SCREAMING_SNAKE_CASE for all environment variables.
NEXT_PUBLIC_* (Next.js) or VITE_* (Vite) for client-side variablesNext.js:
NEXT_PUBLIC_* - Client-side accessible (embedded in bundle) - use for API URLs, public keys, feature flagsVite:
VITE_* - Client-side accessible (embedded in bundle) - use for API URLs, public configurationNode.js/Server:
NODE_ENV - Standard environment (development, production, test)PORT - Server port numberSee examples/naming-and-templates.md for complete code examples with good/bad comparisons.
Core dependencies:
@t3-oss/env-nextjs, @t3-oss/env-core): Recommended wrapper for client/server separationFramework support:
NEXT_PUBLIC_* prefix for client-sideVITE_* prefix for client-sideMonorepo considerations:
Replaces / Conflicts with:
<decision_framework>
See reference.md for complete decision frameworks including environment configuration and feature flag decisions.
</decision_framework>
<red_flags>
High Priority Issues:
NEXT_PUBLIC_* or VITE_* prefix for secrets (embeds in client bundle)Medium Priority Issues:
Gotchas:
z.coerce.number() for numbers, use z.stringbool() for booleans (Zod 4+)z.coerce.boolean() converts "false" to true (string is truthy) - use z.stringbool() (Zod 4+) insteadundefined - use T3 Env's emptyStringAsUndefined: true optionSee reference.md for complete RED FLAGS, anti-patterns, and checklists.
</red_flags>
<critical_reminders>
All code must follow project conventions in CLAUDE.md
(You MUST validate ALL environment variables with Zod at application startup)
(You MUST use framework-specific prefixes for client-side variables - NEXT_PUBLIC_* for Next.js, VITE_* for Vite)
(You MUST maintain .env.example templates with ALL required variables documented)
(You MUST never commit secrets to version control - use .env.local and CI secrets)
(You MUST use per-app .env files - NOT root-level .env files)
Failure to follow these rules will cause runtime errors, security vulnerabilities, and configuration confusion.
</critical_reminders>
npx claudepluginhub agents-inc/skills --plugin infra-config-setup-envManage environment variables, runtime config, and server-only module boundaries safely for Next.js apps. Validates env vars at build time with Zod and prevents client-side leaks.
Analyzes environment variables in code, generates .env.example templates, validates configurations and types, documents variables with examples, and provides naming and security best practices.
Manages full lifecycle of secrets and environment variables: decides placement (constant, .env, CI secret, env var), scaffolds .env.example/.gitignore, add/update/rotate/remove/migrate/audit/provision across envs. Language-agnostic.