Skip to main content

Environment Variables

Egern supports configuring environment variables (env) for scripts, widgets, and modules. Environment variables are passed as key-value pairs and can be accessed via ctx.env in scripts, allowing the same script to be flexibly configured for different scenarios without modifying the code.

Basic Usage​

Defining in Scripts​

All five script types support the env field:

scriptings:
- generic:
name: "my-script"
script_url: "https://example.com/scripts/my-script.js"
env:
API_KEY: "your_api_key"
API_URL: "https://api.example.com"
- http_request:
name: "modify-header"
match: "^https://api\\.example\\.com/"
script_url: "https://example.com/scripts/modify-header.js"
env:
TOKEN: "my-secret-token"
- schedule:
name: "daily-checkin"
cron: "0 8 * * *"
script_url: "https://example.com/scripts/checkin.js"
env:
USERNAME: "user123"

Defining in Widgets​

widgets:
- name: "weather-widget"
env:
CITY: "Shanghai"
UNIT: "celsius"

Defining in Module References​

modules:
- url: "https://example.com/module.yaml"
enabled: true
env:
API_KEY: "your_api_key"
REGION: "cn"

Accessing in Scripts​

Environment variables are accessible in scripts via ctx.env as key-value pairs:

export default async function(ctx) {
const apiKey = ctx.env.API_KEY;
const apiUrl = ctx.env.API_URL;

const resp = await ctx.http.get(apiUrl + '/data', {
headers: { 'Authorization': 'Bearer ' + apiKey }
});
const data = await resp.json();
console.log(data);
}

Priority and Merging​

When the same key exists at multiple levels, the priority from highest to lowest is:

Module > Widget > Script

Module-level env overrides widget-level variables with the same key, and widget-level env overrides script-level variables with the same key.

Merging Example​

Given the following configuration:

scriptings:
- generic:
name: "my-widget"
script_url: "https://example.com/scripts/widget.js"
env:
COLOR: "blue"
TIMEOUT: "10"
MODE: "default"

widgets:
- name: "my-widget"
env:
COLOR: "red"
REGION: "Asia"

The actual ctx.env received by the script will be:

KeyValueSource
COLOR"red"Widget (overrides script's "blue")
TIMEOUT"10"Script
MODE"default"Script
REGION"Asia"Widget

If this widget comes from a module with env defined in the module reference:

modules:
- url: "https://example.com/module.yaml"
env:
COLOR: "green"
LANG: "zh"

The final ctx.env will be:

KeyValueSource
COLOR"green"Module (highest priority)
TIMEOUT"10"Script
MODE"default"Script
REGION"Asia"Widget
LANG"zh"Module

Use Cases​

  • API key management: Store API keys in env so script files can be shared publicly without exposing secrets.
  • Multi-instance reuse: Use the same script with different env values to create multiple widgets, e.g., a single weather script displaying different cities.
  • Module parameterization: Module authors provide generic functionality; users pass personalized parameters via env.
  • Environment differentiation: Use env to distinguish between development/production API endpoints.
# Same script, different env, displaying weather for different cities
scriptings:
- generic:
name: "weather"
script_url: "https://example.com/scripts/weather.js"

widgets:
- name: "weather-sh"
script_name: "weather"
env:
CITY: "Shanghai"
- name: "weather-bj"
script_name: "weather"
env:
CITY: "Beijing"