{"id":19138528,"url":"https://github.com/rsgalloway/envstack","last_synced_at":"2026-02-20T16:03:46.322Z","repository":{"id":256214784,"uuid":"854621066","full_name":"rsgalloway/envstack","owner":"rsgalloway","description":"layered, structural environment management","archived":false,"fork":false,"pushed_at":"2026-02-04T13:36:41.000Z","size":392,"stargazers_count":10,"open_issues_count":8,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-05T00:51:55.753Z","etag":null,"topics":["dotenv","env","environment-variables","environments","python-dotenv","rez","stack","vfx","vfx-pipeline","virtualization"],"latest_commit_sha":null,"homepage":"https://envstack.dev","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rsgalloway.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-09-09T13:51:16.000Z","updated_at":"2026-01-13T12:51:01.000Z","dependencies_parsed_at":null,"dependency_job_id":"c8062d73-7796-4c48-bab2-72d086b4d164","html_url":"https://github.com/rsgalloway/envstack","commit_stats":null,"previous_names":["rsgalloway/envstack"],"tags_count":40,"template":false,"template_full_name":null,"purl":"pkg:github/rsgalloway/envstack","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsgalloway%2Fenvstack","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsgalloway%2Fenvstack/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsgalloway%2Fenvstack/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsgalloway%2Fenvstack/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rsgalloway","download_url":"https://codeload.github.com/rsgalloway/envstack/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rsgalloway%2Fenvstack/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29656590,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T09:27:29.698Z","status":"ssl_error","status_checked_at":"2026-02-20T09:26:12.373Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dotenv","env","environment-variables","environments","python-dotenv","rez","stack","vfx","vfx-pipeline","virtualization"],"created_at":"2024-11-09T06:43:06.504Z","updated_at":"2026-02-20T16:03:46.316Z","avatar_url":"https://github.com/rsgalloway.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"envstack\n========\n\nEnvironment variable composition and activation layer for tools and processes.\n\n\u003e envstack is what `.env` files wish they were when they grew up.\n\n## Why envstack?\n\n- Hierarchical environment composition\n- Explicit precedence and overrides\n- Late-bound environment activation\n- Shared, policy-driven environments\n- Inspectable and deterministic behavior\n\nenvstack environments are layered hierarchically, with later layers inheriting\nfrom and overriding earlier ones.\n\n```mermaid\nflowchart LR\n  default[default.env] --\u003e prod[prod.env]\n  prod --\u003e dev[dev.env]\n  prod --\u003e test[test.env]\n```\n\nLater layers override earlier ones. Use envstack -t VAR to trace where a value\ncomes from. envstack focuses on **configuration and activation**, not dependency\nresolution.\n\nFor the core concepts, see\n[docs/index.md](https://github.com/rsgalloway/envstack/blob/master/docs/index.md).\n\n## Installation\n\nThe easiest way to install:\n\n```bash\npip install -U envstack\n```\n\n## Quickstart\n\nStart by getting the latest\n[default.env](https://github.com/rsgalloway/envstack/blob/master/examples/default/default.env) \nexample file:\n\n```bash\ncurl -o \\\ndefault.env \\\nhttps://raw.githubusercontent.com/rsgalloway/envstack/master/examples/default/default.env\n```\n\nRunning `envstack` will launch a new shell session with the resolved environment:\n\n```shell\n$ envstack\n🚀 Launching envstack shell... (CTRL+D or \"exit\" to quit)\n(prod) ~$ echo $ENV\nprod\n```\n\nTo inspect the unresolved environment (before variable expansion):\n\n```bash\n$ envstack -u\nDEPLOY_ROOT=${ROOT}/${ENV}\nENV=prod\nENVPATH=${DEPLOY_ROOT}/env:${ENVPATH}\nLOG_LEVEL=${LOG_LEVEL:=INFO}\nPATH=${DEPLOY_ROOT}/bin:${PATH}\nPS1=\\[\\e[32m\\](${ENV})\\[\\e[0m\\] \\w\\$ \nPYTHONPATH=${DEPLOY_ROOT}/lib/python:${PYTHONPATH}\nROOT=/mnt/pipe\nSTACK=default\n```\n\n```bash\n$ envstack -r DEPLOY_ROOT\nDEPLOY_ROOT=/mnt/pipe/prod\n```\n\n## How envstack finds environments\n\nenvstack discovers environment definitions via the `ENVPATH` environment variable.\n`ENVPATH` is to envstack what `PATH` is to executables:\n\n```bash\nENVPATH=/path/to/dev/env:/path/to/prod/env\n```\nIn this case, environments in dev override or layer on top of environments in\nprod.\n\n## Converting `.env` files\n\nConvert existing `.env` files to envstack by piping them into envstack:\n\n```bash\ncat .env | envstack --set -o out.env\n```\n\n## Running Commands\n\nTo run any command line executable inside of an environment stack, where\n`[COMMAND]` is the command to run:\n\n```bash\n$ envstack [STACK] -- [COMMAND]\n```\n\nFor example:\n\n```bash \n$ envstack -- echo {ENV}\nprod\n```\n\nExample of injecting environment into a subprocess:\n\n```bash\n$ echo \"console.log('Hello ' + process.env.ENV)\" \u003e index.js\n$ node index.js \nHello undefined\n$ envstack -- node index.js \nHello prod\n```\n\n## Secrets and encryption\n\nenvstack supports optional encryption of environment values when writing\nenvironment files, allowing sensitive configuration to be safely stored,\ncommitted, or distributed.\n\nEncryption protects values **at rest** and integrates with environment stacks and\nincludes. envstack does not attempt to be a full secret management system.\n\nSee [docs/secrets.md](https://github.com/rsgalloway/envstack/blob/master/docs/secrets.md) for details.\n\n## Documentation\n\n- [Design \u0026 philosophy](https://github.com/rsgalloway/envstack/blob/master/docs/design.md)\n- [Examples \u0026 patterns](https://github.com/rsgalloway/envstack/blob/master/docs/examples.md)\n- [Tool comparisons](https://github.com/rsgalloway/envstack/blob/master/docs/comparison.md)\n- [Secrets and encryption](https://github.com/rsgalloway/envstack/blob/master/docs/secrets.md)\n- [FAQ \u0026 gotchas](https://github.com/rsgalloway/envstack/blob/master/docs/faq.md)\n- [API docs](https://github.com/rsgalloway/envstack/blob/master/docs/api.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frsgalloway%2Fenvstack","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frsgalloway%2Fenvstack","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frsgalloway%2Fenvstack/lists"}