Skip to content

Comparison

envGo is intentionally narrow. This page makes the trade-offs explicit so you can decide in 2 minutes whether it fits your project.

What envGo has

  • Zero-dependency single binaryCGO_ENABLED=0, standard library only, go vet/go test clean. No Node, no Python, no runtime to install. Size ~2–12 MB.
  • Static server + secure proxy — serves your index.html and injects {VAR} server-side. The browser only sees placeholders and window.EnvLoaded[NAME]=true.
  • Two modes — Local (/proxy + per-process token X-EnvGo-Token, checked with Host + Origin + subtle.ConstantTimeCompare) and Public (/api/<name> fixed routes from envgo.routes.json).
  • Per-route gatewayvars allow-set, per-route rate_limit (fixed-window), optional bearer auth, scrub_response via logger.Redact.
  • Hot-reloadinternal/envstore polls .env every 1.5 s, no restart.
  • Dashboard (metadata only)GET /__envgo_dashboard shows variable names and last 200 requests, never values.
  • DiagnosticsGET /__env.js typo detection (Levenshtein ≤3) with red banner, PHP echo getenv warning, missing vars warning at startup.
  • PHP — executes .php via php binary with .env injected, 30 s timeout, header parsing.
  • TLS--tls self-signed (TLS 1.2+), or run plain 127.0.0.1:8080 behind Caddy/nginx.
  • Cross-platformmake release builds darwin/linux/windows amd64+arm64, UPX on linux/windows.
  • AI-friendly — one copy-paste prompt (/envgo-agent-prompt.txt) that teaches any agent to envgo -v → auto-install → envgo initenvgo run dev.

What envGo does not have

Be explicit about this before you commit:

  • No database, no sessions, no user auth. The token is per-process, not per-user. Any page on your own origin can fetch it.
  • No auto-HTTPS. --tls is self-signed for dev. Production TLS is your reverse proxy (Caddy does Let’s Encrypt).
  • No unlimited abuse protection by default. default_rate_limit is empty → unlimited until you set 30/min etc. Rate limiting is also per-process and needs trust_proxy: true behind a proxy.
  • No streaming scrub. SSE passthrough skips redaction to avoid buffering — an upstream that echoes a secret in a stream leaks it.
  • No build step. envGo serves files as-is. It does not bundle, minify, or transpile JS.
  • No secret rotation / vault. It reads a flat .env file. For Vault/AWS Secrets Manager, sync to .env yourself.
  • No multi-tenant isolation. One .env, one gateway config per process. For per-user keys, you need a real backend.

If you need any of the above, envGo is the wrong tool — use Next.js/Nuxt API routes or a Worker.

Head-to-head

Scroll horizontally to see all columns →

AreaenvGoVite server.proxy / http-proxy-middlewareNext.js / Nuxt API routesCaddy / nginxCloudflare Workers / Vercel Functions
RuntimeNone — single Go binaryNode + node_modulesNode + frameworkCaddy/nginx binaryCloud account + wrangler/vercel
Secret stays server-side?Yes — {VAR} substituted in Go (proxy.inject, gateway.inject)Yes, but you write the handler yourselfYes — process.env on serverYes with header_up/templates, but manualYes — env.MY_SECRET in Worker
Leak via bundle?No — browser gets booleans onlyRisk if you use import.meta.env in clientRisk if you forget NEXT_PUBLIC_ prefixNo (static files)No
Setupenvgo initenvgo run devvite.config.js proxy table + custom handlerpages/api/*.ts per endpointCaddyfile/nginx.conf + sub_filterwrangler.toml + fetch handler
Hot-reload .envYes (1.5 s poll)Restart neededRestart neededReload neededRedeploy
Dashboard / historyYes — /__envgo_dashboard names onlyNoNoNoCloud logs only
Typo detectionYes — red banner + Levenshtein suggestion (server/serveEnvJS, server/detectPHPTypo)NoNoNoNo
Fixed public routesYes — /api/<name> with vars + rate_limit + authManual per-route handlerManual per-route handlerManual handle /api/*Manual export default { fetch }
Rate limitingPer-route fixed-window, per-IP (ratelimit.Limiter)You add express-rate-limitYou add middlewarerate_limit directiveKV / Durable Objects
Auth per routeBearer matching {ENV_VAR}You code itnext-auth etc.forward_authYou code it
PHPYes — php exec with .env envNoNophp_fastcgiNo
TLSSelf-signed (--tls) or proxyDev via mkcertVercel autoCaddy auto Let’s EncryptCloud auto
Binary / deploy size2–12 MB single filenode_modules hundreds MBFramework + build~15–40 MBBundle < few MB
Best forStatic HTML/vanilla JS + one API key, AI-generated sites, internal tools, no-build demosSPA dev already on ViteFull-stack React/Vue appStatic site behind existing Caddy/nginxEdge, multi-region, KV/DB

When to choose what

You are…Pick
Beginner, designer, AI agent that just generated index.html and needs to call OpenAI without learning NodeenvGo
Already building a SPA with Vite and comfortable writing a small proxy handlerVite proxy
Building a full app with DB, auth, SSRNext.js / Nuxt
Already running Caddy/nginx in prod and want templates or header_upCaddy/nginx
Need global edge, KV, or pay-per-requestWorkers / Functions

Bottom line

envGo is not a replacement for a backend. It is a bridge for the gap between “I have a static HTML file” and “I need one secret without learning a framework.” If that gap is your project, envGo is the shortest path. If you have already crossed that gap, stick with what you have.

Further reading: Threat Model, Configuration, How It Works.