Use when managing environment variables and project settings with Mise. Covers env configuration, direnv replacement, and per-directory settings.
Limited to specific tools
Additional assets for this skill
This skill is limited to using the following tools:
name: mise-environment-management description: Use when managing environment variables and project settings with Mise. Covers env configuration, direnv replacement, and per-directory settings. allowed-tools:
Managing environment variables, project settings, and directory-specific configuration with Mise.
# mise.toml
[env]
NODE_ENV = "production"
DATABASE_URL = "postgresql://localhost/myapp"
API_KEY = "development-key"
LOG_LEVEL = "info"
# Activate mise environment
mise activate bash # Or zsh, fish
# Or use mise exec
mise exec -- node app.js
# Or mise run
mise run start
[env]
PROJECT_ROOT = "{{ config_root }}"
DATA_DIR = "{{ config_root }}/data"
LOG_FILE = "{{ config_root }}/logs/app.log"
[env]
_.file = ".env"
_.file = [".env", ".env.local"]
[env]
# Set based on other variables
DATABASE_URL = "postgresql://{{ env.DB_HOST | default(value='localhost') }}/{{ env.DB_NAME }}"
[env]
_.path = [
"{{ config_root }}/bin",
"{{ config_root }}/scripts",
"/usr/local/bin"
]
[env]
LD_LIBRARY_PATH = "{{ config_root }}/lib:$LD_LIBRARY_PATH"
DYLD_LIBRARY_PATH = "{{ config_root }}/lib:$DYLD_LIBRARY_PATH"
[tools]
python = "3.12"
[env]
_.python.venv = { path = ".venv", create = true }
VIRTUAL_ENV = "{{ config_root }}/.venv"
[tools]
node = "20.10.0"
[env]
NODE_ENV = "development"
NODE_OPTIONS = "--max-old-space-size=4096"
NPM_CONFIG_PREFIX = "{{ config_root }}/.npm-global"
[tools]
go = "1.21"
[env]
GOPATH = "{{ config_root }}/.go"
GOBIN = "{{ config_root }}/.go/bin"
GO111MODULE = "on"
# Instead of .envrc
# export DATABASE_URL=postgresql://localhost/myapp
# export NODE_ENV=development
# Use mise.toml
[env]
DATABASE_URL = "postgresql://localhost/myapp"
NODE_ENV = "development"
# mise.toml - mark as trusted
[settings]
experimental_monorepo_root = true # Trust subdirectories
Mise automatically reloads when mise.toml changes, similar to direnv.
# ~/.config/mise/config.toml
[env]
EDITOR = "code"
GIT_AUTHOR_NAME = "Your Name"
GIT_AUTHOR_EMAIL = "you@example.com"
# ~/projects/myapp/mise.toml
[env]
PROJECT_NAME = "myapp"
DATABASE_URL = "postgresql://localhost/myapp"
# ~/projects/myapp/mise.local.toml (gitignored)
[env]
DATABASE_URL = "postgresql://localhost/myapp-dev"
DEBUG = "true"
# mise.toml
[env]
_.file = ".env.local" # Gitignored file with secrets
# .env.local (add to .gitignore)
API_KEY=secret-key-here
DATABASE_PASSWORD=secret-password
[env]
# Reference existing environment variables
API_KEY = "$API_KEY"
DATABASE_URL = "$DATABASE_URL"
# Don't commit secrets to mise.toml
# Instead, reference from external secret managers
# Example with 1Password CLI
mise exec -- op run -- node app.js
# Or load from encrypted file
mise exec -- sops exec-env .env.encrypted -- node app.js
Mise provides these variables automatically:
$MISE_ORIGINAL_CWD # Directory where mise was invoked
$MISE_CONFIG_ROOT # Directory containing mise.toml
$MISE_PROJECT_ROOT # Project root directory
$MISE_DATA_DIR # Mise data directory
$MISE_CACHE_DIR # Mise cache directory
[env]
PROJECT_ROOT = "{{ env.MISE_PROJECT_ROOT }}"
CONFIG_FILE = "{{ env.MISE_CONFIG_ROOT }}/config.yaml"
# Show current environment
mise env
# Show specific variable
mise env DATABASE_URL
# Export as shell commands
mise env -s bash > .env.sh
source .env.sh
# Check loaded config files
mise config
# Show resolved settings
mise settings
# mise.toml (committed)
[env]
NODE_ENV = "development"
LOG_LEVEL = "info"
API_URL = "https://api.example.com"
# mise.local.toml (gitignored)
[env]
API_KEY = "secret-key"
DATABASE_PASSWORD = "secret-password"
# Good: Clear, descriptive names
[env]
DATABASE_CONNECTION_POOL_SIZE = "10"
API_REQUEST_TIMEOUT_MS = "5000"
FEATURE_FLAG_NEW_UI = "true"
# Avoid: Vague abbreviations
[env]
DB_POOL = "10"
TIMEOUT = "5000"
FLAG = "true"
# mise.toml
[env]
# Database configuration (required)
DATABASE_URL = "postgresql://localhost/myapp"
# API keys (set in mise.local.toml)
# API_KEY = "your-key-here"
# Optional feature flags
FEATURE_ANALYTICS = "false"
# Good: Relative to config root
[env]
DATA_DIR = "{{ config_root }}/data"
LOGS_DIR = "{{ config_root }}/logs"
# Avoid: Hardcoded paths
[env]
DATA_DIR = "/Users/me/project/data"
# mise.toml - base configuration
[env]
APP_NAME = "myapp"
LOG_FORMAT = "json"
# mise.development.toml
[env]
NODE_ENV = "development"
DEBUG = "true"
DATABASE_URL = "postgresql://localhost/myapp_dev"
# mise.production.toml
[env]
NODE_ENV = "production"
DEBUG = "false"
DATABASE_URL = "postgresql://prod-server/myapp"
# Switch environments
ln -sf mise.development.toml mise.local.toml
# Or
ln -sf mise.production.toml mise.local.toml
[env]
DATABASE_HOST = "localhost"
DATABASE_PORT = "5432"
DATABASE_NAME = "myapp"
DATABASE_USER = "postgres"
DATABASE_URL = "postgresql://{{ env.DATABASE_USER }}:{{ env.DATABASE_PASSWORD }}@{{ env.DATABASE_HOST }}:{{ env.DATABASE_PORT }}/{{ env.DATABASE_NAME }}"
[env]
# Feature toggles
FEATURE_NEW_DASHBOARD = "true"
FEATURE_BETA_API = "false"
FEATURE_EXPERIMENTAL_CACHE = "true"
# Feature rollout percentages
FEATURE_NEW_CHECKOUT_ROLLOUT = "25"
# mise.toml
[env]
NODE_ENV = "{{ env.CI | default(value='development') }}"
SKIP_PREFLIGHT_CHECK = "{{ env.CI | default(value='false') }}"
# Bad: Secrets in committed file
[env]
API_KEY = "sk-secret-key-12345"
DATABASE_PASSWORD = "password123"
# Good: Reference from secure location
[env]
_.file = ".env.local" # Gitignored
# Bad: Repeating global settings in every project
# ~/project-a/mise.toml
[env]
EDITOR = "code"
GIT_AUTHOR_NAME = "Your Name"
# ~/project-b/mise.toml
[env]
EDITOR = "code"
GIT_AUTHOR_NAME = "Your Name"
# Good: Use global config
# ~/.config/mise/config.toml
[env]
EDITOR = "code"
GIT_AUTHOR_NAME = "Your Name"
# Bad: Hardcoded check
[tasks.deploy]
run = '''
if [ "$NODE_ENV" = "production" ]; then
./deploy-prod.sh
fi
'''
# Good: Use configuration
[tasks.deploy]
env = { DEPLOYMENT_TARGET = "production" }
run = "./deploy.sh"
[env]
# Load environment based on git branch
BRANCH = "{{ exec(command='git branch --show-current') }}"
DEPLOY_ENV = "{{ env.BRANCH | replace(from='main', to='production') | replace(from='develop', to='staging') }}"
[env]
PROJECT_NAME = "myapp"
NAMESPACE = "{{ env.PROJECT_NAME }}-{{ env.ENVIRONMENT }}"
REDIS_URL = "redis://{{ env.NAMESPACE }}-redis:6379"
# Base configuration
[env]
LOG_LEVEL = "info"
CACHE_TTL = "3600"
# Override in specific contexts
[env.production]
LOG_LEVEL = "warn"
CACHE_TTL = "7200"