npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@wchen.ai/env-from-example

v1.1.0

Published

Interactive and non-interactive CLI to set up .env from .env.example

Readme

env-from-example

Interactive and non-interactive CLI to set up .env from .env.example.

Walks you through each variable, validates types, auto-generates secrets, and prints a summary of what was configured. All type detection and validation are driven by a bundled schema.json.

Quick Start

# Run without installing (npx fetches and runs)
npx @wchen.ai/env-from-example

# After installing in your project, use the short form:
npx env-from-example

# Don't have a .env.example yet? Create one:
npx env-from-example --init            # starter template, add env vars, then polish
npx env-from-example --init .env       # from your existing .env

# Don't have a .env? Generate one from .env.example
npx env-from-example                   # Generate .env
npx env-from-example -e staging        # Generate .env.staging

Installation

Install in your project so you can run npx env-from-example from the project root:

npm install @wchen.ai/env-from-example
# or
pnpm add @wchen.ai/env-from-example
# or as a dev dependency (recommended for CLI tools)
npm install -D @wchen.ai/env-from-example
pnpm add -D @wchen.ai/env-from-example

Then run from your project root: npx env-from-example (or add it to your package.json scripts).

Setup

Add a .env.example in your project root (or run env-from-example --init to create one).

npx env-from-example --init            # starter template
npx env-from-example --init .env       # from your existing .env

Before and after (first run)

If you start with only a .env.example and no .env (or an empty one), running the tool fills in .env from your answers and defaults.

Before — you have .env.example and no .env (or .env is empty):

# .env.example (excerpt)
DATABASE_URL=postgres://localhost:5432/myapp
API_KEY=
NODE_ENV=development
SESSION_SECRET=
# .env — missing or empty

After — run env-from-example (or env-from-example -y to accept defaults). The CLI prompts for required values, can auto-generate secrets (e.g. SESSION_SECRET), and writes:

# .env — created/updated by env-from-example
DATABASE_URL=postgres://localhost:5432/myapp
API_KEY=your-api-key-here
NODE_ENV=development
SESSION_SECRET=a1b2c3d4e5f6...

Use env-from-example -y --dry-run to preview the result without writing files.

Usage

Run from your project root (where .env.example lives):

env-from-example

Options:

| Flag | Description | | ---------------------- | ----------------------------------------------------------------------------------- | | -y, --yes | Non-interactive: accept existing values or defaults without prompting | | -f, --force | Force re-run even if .env is already up-to-date | | -e, --env <name> | Target environment (e.g., local, test, production) | | --cwd <path> | Project root directory (default: current working directory) | | --init [source] | Create .env.example from an existing env file or from scratch | | --polish | Polish .env.example: add descriptions, types, defaults (-y for non-interactive) | | --version [bump] | Bump or set ENV_SCHEMA_VERSION (patch, minor, major, or exact semver) | | --sync-package | With --version: also update package.json version | | --validate [envFile] | Validate .env against .env.example schema (exit 1 if invalid) | | --dry-run | Preview what would be written without creating/modifying files |

Examples:

# Interactive setup (default .env)
env-from-example

# Non-interactive: create/update .env with defaults or existing values
env-from-example -y

# Preview what would be generated (no files written)
env-from-example -y --dry-run

# Create .env.local with prompts
env-from-example -e local

# Create .env.test without prompts (e.g. CI)
env-from-example -y -e test

# Force re-run even if .env is up-to-date
env-from-example -f

# Run from another directory (e.g. monorepo package)
env-from-example --cwd ./apps/api

# Override a variable via CLI
env-from-example --database-url "postgres://prod:5432/db" -y

# Bump ENV_SCHEMA_VERSION
env-from-example --version patch
env-from-example --version minor --sync-package

# Validate .env against .env.example schema
env-from-example --validate

Annotations

Each variable in .env.example can be annotated with structured tags in the comment line above it:

# <description> [REQUIRED] [TYPE: <schema-type>] [CONSTRAINTS: key=value,...] Default: <value>
VARIABLE_NAME=default_value

| Annotation | Syntax | Purpose | | ----------- | ------------------------------ | ---------------------------------------------------- | | Description | Free text at start of comment | Human-readable explanation | | Required | [REQUIRED] | Variable must be non-empty | | Type | [TYPE: <schema-type>] | Type from schema.json for validation and detection | | Constraints | [CONSTRAINTS: key=value,...] | Constraints (min, max, pattern, etc.) | | Default | Default: <value> | Documented default (informational) |

All annotations are optional. The --polish command auto-detects and adds them.

Polish: before and after

env-from-example --polish (or --polish -y for non-interactive) updates your .env.example with inferred descriptions, types, and default annotations.

Before — minimal .env.example:

DATABASE_URL=postgres://localhost:5432/myapp
PORT=3000
NODE_ENV=development
API_KEY=

After — run env-from-example --polish -y:

# env-from-example (https://www.npmjs.com/package/@wchen.ai/env-from-example)

# ENV_SCHEMA_VERSION="1.0.0"

# ========================================
#                Database
# ========================================

# Database Url
# [REQUIRED] [TYPE: network/uri] Default: postgres://localhost:5432/myapp
DATABASE_URL=postgres://localhost:5432/myapp

# ========================================
#                  App
# ========================================

# Application port
# [REQUIRED] [TYPE: integer] [CONSTRAINTS: min=3000,max=10000] Default: 3000
PORT=3000

# Node Env
# [TYPE: structured/enum] [CONSTRAINTS: pattern=^(development|test|staging|production|ci)$] Default: development
NODE_ENV=development

# ========================================
#                 Other
# ========================================

# OPEN AI API KEY
# [REQUIRED] [TYPE: credentials/secret] Default: (empty)
API_KEY=

Use env-from-example --polish --dry-run to preview changes without writing the file.

CI / CD

GitHub Actions -- generate .env.test before running tests:

# .github/workflows/test.yml
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - run: npm ci
      - run: npx env-from-example -y -e test
      - run: npm test

Pre-commit hook -- validate .env stays in sync:

# .husky/pre-commit
npx env-from-example --validate

Requirements

  • A .env.example file in the project root (or the path given by --cwd). Run env-from-example --init to create one.
  • schema.json is bundled with the package and used automatically.

License

ISC