Skip to content

Variable References

Variable references let you build values from other values, reducing duplication and making updates easier.

Use ${VAR_NAME} to reference another secret:

Terminal window
soup set api base DB_HOST localhost
soup set api base DB_PORT 5432
soup set api base DATABASE_URL 'postgres://${DB_HOST}:${DB_PORT}/mydb'

When you get DATABASE_URL, Soup resolves the references:

5432/mydb
soup get api base DATABASE_URL

References are resolved within the same environment context:

Terminal window
# base
soup set api base DB_HOST localhost
# prod
soup set api prod DB_HOST prod-db.internal
soup set api prod DATABASE_URL 'postgres://${DB_HOST}:5432/mydb'
soup get api prod DATABASE_URL
# Output: postgres://prod-db.internal:5432/mydb

If a referenced variable isn’t in the current environment, inheritance kicks in:

Terminal window
# base
soup set api base DB_HOST localhost
soup set api base DATABASE_URL 'postgres://${DB_HOST}:5432/mydb'
# prod only overrides DB_HOST
soup set api prod DB_HOST prod-db.internal
soup get api prod DATABASE_URL # DATABASE_URL inherited from base
# Output: postgres://prod-db.internal:5432/mydb
# The ${DB_HOST} in base's DATABASE_URL resolves to prod's DB_HOST

References can chain through multiple variables:

Terminal window
soup set api base HOST localhost
soup set api base PORT 5432
soup set api base ENDPOINT '${HOST}:${PORT}'
soup set api base URL 'postgres://${ENDPOINT}/mydb'
soup get api base URL
# Output: postgres://localhost:5432/mydb
Terminal window
soup set api base DB_USER myapp
soup set api base DB_PASSWORD secret123
soup set api base DB_HOST localhost
soup set api base DB_PORT 5432
soup set api base DB_NAME myapp
soup set api base DATABASE_URL 'postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}'
Terminal window
soup set api base API_HOST api.example.com
soup set api base API_VERSION v1
soup set api base API_BASE_URL 'https://${API_HOST}/${API_VERSION}'
soup set api base USERS_URL '${API_BASE_URL}/users'
soup set api base ORDERS_URL '${API_BASE_URL}/orders'
Terminal window
soup set api base REDIS_HOST localhost
soup set api base REDIS_PORT 6379
soup set api base REDIS_PASSWORD ""
soup set api base REDIS_URL 'redis://:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}'
Terminal window
soup set api base AWS_REGION us-east-1
soup set api base AWS_ACCOUNT_ID 123456789
soup set api base S3_BUCKET 'my-app-${AWS_REGION}'
soup set api base SQS_QUEUE 'arn:aws:sqs:${AWS_REGION}:${AWS_ACCOUNT_ID}:my-queue'

To use a literal ${...} without resolution, escape it:

Terminal window
soup set api base TEMPLATE 'Hello $${NAME}' # Note: double $
soup get api base TEMPLATE
# Output: Hello ${NAME}

If a referenced variable doesn’t exist, you get an error:

Terminal window
soup set api base URL '${UNDEFINED_VAR}'
soup get api base URL
# Error: Unresolved reference: ${UNDEFINED_VAR}

Soup detects circular references:

Terminal window
soup set api base A '${B}'
soup set api base B '${A}'
soup get api base A
# Error: Circular reference detected: A -> B -> A

References are limited to 10 levels deep:

Terminal window
# If you have A -> B -> C -> ... -> K (11 levels)
# Error: Max reference depth exceeded

The CLI resolves references by default:

5432/mydb
soup get api base DATABASE_URL

To see the raw value with ${...} intact:

Terminal window
soup get api base DATABASE_URL --raw
# Output: postgres://${DB_HOST}:${DB_PORT}/mydb

The API accepts a resolve query parameter:

Terminal window
# Resolved (default)
curl .../secrets?resolve=true
# Unresolved
curl .../secrets?resolve=false
Terminal window
# Good - easy to override parts
soup set api base DB_HOST localhost
soup set api base DB_PORT 5432
soup set api base DATABASE_URL 'postgres://${DB_HOST}:${DB_PORT}/mydb'
# Less good - have to override the whole thing
soup set api base DATABASE_URL postgres://localhost:5432/mydb

Follow a pattern for component variables:

Terminal window
# Service_Component pattern
soup set api base POSTGRES_HOST ...
soup set api base POSTGRES_PORT ...
soup set api base REDIS_HOST ...
soup set api base REDIS_PORT ...

For chains of references, add comments in your project’s documentation.

After setting up references, verify they resolve correctly:

Terminal window
soup list api prod --resolved