Skip to main content
Configuration comes from two places: the classes in config.py and the environment. Where both set the same key, config.py wins.

The scaffolded config.py

config.py

A typical .env

.env

Core

Hosting and proxies

Authentication and tenancy

Storage, cache and jobs

Automatic backends

When the app does not set a backend, Feather picks one from what the environment provides. A hosting platform that injects REDIS_URL or S3_BUCKET then works without further configuration. An explicit value is one set in config.py or in the environment. An empty string counts as unset. A config.py line such as JOB_BACKEND = os.environ.get("JOB_BACKEND", "thread") is explicit, so that app keeps thread whatever the environment holds. The scaffold writes JOB_BACKEND = os.environ.get("JOB_BACKEND") so the choice is left to Feather. The app resolves the three settings once at startup, writes the result back into app.config, and logs it at INFO:
With REDIS_URL set and JOB_BACKEND unset, jobs go to Redis and only run if a feather worker process is consuming them. Set JOB_BACKEND=thread or sync when you run no worker.

Development

feather env check reports which of these keys your config.py reads and which are missing from your environment. It exits non-zero when a key with no fallback is unset, so it works as a CI or deploy gate.