Skip to main content

App Environment API

The App Environment API provides access to the current environment profile and custom environment variables defined in your configuration.

Environment Profiles

Krema supports environment profiles that can be selected at runtime using the --profile flag:

krema dev --profile development
krema build --profile production

Profiles are defined in krema.toml under the [env.*] sections.

Commands

app:getEnvironment

Returns the complete environment information including name and custom variables.

const env = await window.krema.invoke('app:getEnvironment');
// {
// name: "development",
// vars: {
// API_URL: "http://localhost:3000",
// DEBUG: "true"
// }
// }

app:getEnvironmentName

Returns just the environment name.

const envName = await window.krema.invoke('app:getEnvironmentName');
// "development" | "staging" | "production" | etc.

app:getEnvironmentVar

Returns a specific environment variable.

const apiUrl = await window.krema.invoke('app:getEnvironmentVar', { key: 'API_URL' });
// "http://localhost:3000"

const missing = await window.krema.invoke('app:getEnvironmentVar', { key: 'NONEXISTENT' });
// null

TypeScript Types

interface AppEnvironment {
name: string;
vars: Record<string, string>;
}

Configuration

Using .env Files

Krema automatically loads environment variables from .env files:

.env                 # Loaded in all environments
.env.local # Loaded in all environments, gitignored
.env.development # Loaded when --profile development
.env.production # Loaded when --profile production

Example .env.development:

API_URL=http://localhost:3000
DEBUG=true
LOG_LEVEL=debug

Example .env.production:

API_URL=https://api.example.com
DEBUG=false
LOG_LEVEL=error

Inline Configuration

You can also define environment-specific variables in krema.toml:

[env.development]
vars = { API_URL = "http://localhost:3000", DEBUG = "true" }

[env.staging]
vars = { API_URL = "https://staging-api.example.com" }

[env.production]
vars = { API_URL = "https://api.example.com" }

Examples

Environment-Aware API Client

class ApiClient {
constructor() {
this.baseUrl = null;
}

async init() {
this.baseUrl = await window.krema.invoke('app:getEnvironmentVar', {
key: 'API_URL'
}) || 'https://api.example.com';

const debug = await window.krema.invoke('app:getEnvironmentVar', {
key: 'DEBUG'
});
this.debug = debug === 'true';
}

async fetch(endpoint, options = {}) {
const url = `${this.baseUrl}${endpoint}`;

if (this.debug) {
console.log(`[API] ${options.method || 'GET'} ${url}`);
}

const response = await fetch(url, options);
return response.json();
}
}

const api = new ApiClient();
await api.init();

Environment Indicator

async function showEnvironmentBadge() {
const envName = await window.krema.invoke('app:getEnvironmentName');

// Only show badge in non-production environments
if (envName !== 'production') {
const badge = document.createElement('div');
badge.className = 'env-badge';
badge.textContent = envName.toUpperCase();
badge.style.cssText = `
position: fixed;
top: 0;
right: 0;
background: ${envName === 'development' ? '#4caf50' : '#ff9800'};
color: white;
padding: 4px 12px;
font-size: 12px;
font-weight: bold;
z-index: 9999;
`;
document.body.appendChild(badge);
}
}

Feature Flags by Environment

async function getFeatureFlags() {
const env = await window.krema.invoke('app:getEnvironment');

// Base flags
const flags = {
analytics: true,
newEditor: false,
darkMode: true
};

// Environment-specific overrides
if (env.name === 'development') {
flags.newEditor = true; // Enable experimental features in dev
flags.analytics = false; // Disable analytics in dev
}

// Check for explicit overrides in env vars
if (env.vars.ENABLE_NEW_EDITOR === 'true') {
flags.newEditor = true;
}

return flags;
}

Conditional Logging

class Logger {
constructor() {
this.level = 'info';
}

async init() {
const level = await window.krema.invoke('app:getEnvironmentVar', {
key: 'LOG_LEVEL'
});
if (level) {
this.level = level;
}
}

debug(...args) {
if (this.level === 'debug') {
console.log('[DEBUG]', ...args);
}
}

info(...args) {
if (['debug', 'info'].includes(this.level)) {
console.log('[INFO]', ...args);
}
}

error(...args) {
console.error('[ERROR]', ...args);
}
}

Notes

  • If no profile is specified, the environment name defaults to "production"
  • Environment variables from .env files take precedence over inline krema.toml definitions
  • The app:getEnvironmentVar command only returns variables defined in your Krema configuration, not system environment variables (use os:env for system variables)