TERMPOD Docs

Configuration

Environment variables, user settings, and configuration options for TermPod desktop, relay, and iOS.

TermPod has two layers of configuration:

  1. User settings (~/.termpod/) — Appearance, keybindings, themes, workflows. See Desktop → Customization for full details.
  2. Environment variables (.env) — Deployment-specific values for building and running the relay, desktop app, and iOS app.

User Settings

The desktop app stores all user preferences as JSON files in ~/.termpod/:

~/.termpod/
├── config.json          # Appearance, terminal, and behavior settings
├── keybindings.json     # Custom keyboard shortcut overrides
├── workflows.json       # Saved command workflows
└── themes/              # Custom terminal color themes (.json files)

Files are watched for changes — edit them in any text editor and the app updates live. See Desktop → Customization for the full reference.

Environment Variables

All sensitive and deployment-specific values are configured via environment variables in a .env file at the project root. Never commit secrets to the repository.

Essential Variables

VariableUsed ByDescription
VITE_RELAY_URLDesktop appRelay WebSocket URL (e.g., wss://relay.termpod.dev)
JWT_SECRETRelay serverJWT signing key — generate with openssl rand -base64 32
APPLE_TEAM_IDiOS + macOSApple Developer Team ID

Auth & Email

VariableUsed ByDescription
RESEND_API_KEYRelay serverResend API key for password reset emails
EMAIL_FROMRelay serverSender address (e.g., TermPod <noreply@email.yourdomain.com>)

Set these via wrangler secret put for production deployments. If RESEND_API_KEY is not configured, the relay returns 503 for password reset requests. Everything else works normally.

Apple Code Signing

VariableUsed ByDescription
APPLE_SIGNING_IDENTITYmacOS buildsCode signing identity
APPLE_IDmacOS notarizationApple ID email
APPLE_PASSWORDmacOS notarizationApp-specific password

Error Tracking

VariableUsed ByDescription
VITE_SENTRY_DSNDesktop appSentry DSN (optional)
SENTRY_DSNRelay + iOSSentry DSN (optional)

WebRTC TURN

VariableUsed ByDescription
TURN_KEY_IDRelay serverCloudflare TURN key ID
TURN_KEY_API_TOKENRelay serverCloudflare TURN API token

Create TURN keys at: Cloudflare Dashboard → Calls → TURN Keys. TURN is optional — without it, WebRTC only works via STUN (fails on symmetric NATs). The relay WebSocket is always available as a fallback.

Subscription Billing

VariableUsed ByDescription
POLAR_WEBHOOK_SECRETRelay serverPolar.sh webhook signature verification
POLAR_API_KEYRelay serverPolar API access

When POLAR_WEBHOOK_SECRET is absent, the relay runs in self-hosted mode with all features unlocked. You only need these if running a hosted multi-user relay with paid subscriptions.

Tauri Updater Signing

VariableNote
TAURI_SIGNING_PRIVATE_KEYMust be set in shell environment, not in .env
TAURI_SIGNING_PRIVATE_KEY_PASSWORDPassword for the signing key

iOS Configuration

The iOS app reads its configuration from Config.xcconfig, generated from .env by apps/ios/generate-config.sh. Run pnpm ios:generate after changing any iOS-relevant variables.

Variables injected into iOS config:

  • RELAY_URL — from VITE_RELAY_URL
  • TERMPOD_TEAM_ID — from APPLE_TEAM_ID
  • SENTRY_DSN — from SENTRY_DSN

Example .env File

# Relay server WebSocket URL
VITE_RELAY_URL=wss://relay.termpod.dev

# Relay server JWT secret
JWT_SECRET=change-me-to-a-random-secret

# Apple Developer
APPLE_TEAM_ID=YOUR_TEAM_ID
APPLE_SIGNING_IDENTITY=Developer ID Application: Your Name (YOUR_TEAM_ID)

# Apple notarization
APPLE_ID=your-apple-id@example.com
APPLE_PASSWORD=your-app-specific-password

# Sentry (optional)
VITE_SENTRY_DSN=

On this page