Skip to main content

Organize your project settings and secrets with ease

Project description

Stela

Easily manage your application settings and secrets

PyPI Build PyPI - Python Version License

Welcome to Stela

Stela were the "information files" of ancient times. This library helps you manage your project settings and secrets with ease, using a simple and consistent approach.

What is Stela?

Stela is a Python library that simplifies how you handle:

  • Settings: Non-sensitive values that can be committed to your repository (API URLs, timeouts, etc.)
  • Secrets: Sensitive values that should not be committed (passwords, tokens, etc.)
  • Environment-specific configurations: Different values for development, testing, and production

TL;DR

  1. In a new project run pip install stela
  2. On terminal, run stela init --default --no-confirm
  3. Uncomment the MY_SECRET line in .env
  4. Add from stela import env and run print(env.MY_SECRET) in your code
  5. Uncomment the MY_SECRET line in .env.local and get the code again.
  6. Add export MY_SECRET=memory_value in your terminal and get the code again.

New to multi-environment setups? Start with the Quick Setup guide: https://megalus.github.io/stela/quick_setup/

Install

pip install stela

Development

# Define your VIRTUAL_ENV location. For example: export VIRTUAL_ENV=$(pwd)
uv sync --active --group dev
make ci

Documentation

For detailed documentation, visit: https://megalus.github.io/stela/

Key Features

  1. Learn once, use everywhere - Works with any Python project or framework
  2. Separate settings from secrets - Use multiple dotenv files to organize your configuration
  3. Environment-specific settings - Easily switch between development, testing, and production environments
  4. Simple API - Access your settings with from stela import env
  5. Extensible - Not limited to dotenv files, can load settings from any source (AWS Parameter Store, Vault, etc.)

Quick Start Guide

Step 1: Initialize Your Project

Run the Stela initialization command to set up your project:

stela init --default

This creates four files:

  • .env - Store your default settings (will be committed to git)
  • .env.local - Store your secrets (will be ignored by git)
  • .stela - Stela configuration file
  • Updates .gitignore to exclude sensitive files

Step 2: Configure Your Settings and Secrets

Add your settings to .env:

# .env - This file WILL be committed to your repository
# Store default settings and fake credentials here
API_URL="http://localhost:8000"
DB_URL="db://fake_user:fake_password@local_db:0000/name"

Add your real secrets to .env.local:

# .env.local - This file will NOT be committed (ignored by git)
# Store real credentials and secrets here
DB_URL="db://real_user:real_password@real_db:0000/name"

Step 3: Access Your Settings in Code

Use the simple API to access your settings and secrets:

# my_script.py
from stela import env

# Access your settings with dot notation
API_URL = env.API_URL  # http://localhost:8000
DATABASE_URL = env.DB_URL  # db://real_user:real_password@real_db:0000/name

Stela automatically loads values from .env first, then overrides them with values from .env.local.

Precedence at a glance

When the same key is defined in multiple places, Stela resolves it using this order (top wins):

  1. Value already present in the process environment (os.environ). Stela will not overwrite existing env vars.
  2. .env.{environment}.local
  3. .env.{environment}
  4. .env.local
  5. .env

If a key is missing everywhere, Stela raises a StelaValueError by default (configurable).

Environment-Specific Configuration

Stela makes it easy to manage different environments (development, testing, production):

Step 1: Create Environment-Specific Files

Create a file for each environment:

# .env.development
API_URL="http://localhost:8000"

# .env.production
API_URL="https://api.example.com"

Step 2: Set the Environment

Set the STELA_ENV environment variable to specify which environment to use:

# For development
export STELA_ENV=development

# For production
export STELA_ENV=production

Step 3: Access Your Settings

Your code remains the same, but Stela will load the appropriate values:

from stela import env

# Will be "http://localhost:8000" when STELA_ENV=development
# Will be "https://api.example.com" when STELA_ENV=production
API_URL = env.API_URL

Advanced: Custom Data Sources

Stela isn't limited to dotenv files. You can load settings from any source:

Step 1: Configure a Final Loader

Add a final loader in your .stela configuration file:

# .stela
[stela]
final_loader = "path.to.my.final_loader"

Step 2: Create Your Loader Function

# my_loaders.py
from typing import Any
from stela.config import StelaOptions


def final_loader(options: StelaOptions, env_data: dict[str, Any]) -> dict[str, Any]:
    """Load settings from a custom source and merge into env_data.

    Args:
        options: Stela configuration options (includes current_environment).
        env_data: Data already loaded from dotenv files.

    Returns:
        Updated data dictionary.
    """
    # Example: pretend we fetched data from an external source
    external = {"API_TIMEOUT": "5", "FEATURE_FLAG": "true"}

    # Merge/override values
    env_data.update(external)
    return env_data

Step 3: Use Your Settings as Usual

from stela import env

# Values can come from dotenv files or your custom source
API_URL = env.API_URL
DB_PASSWORD = env.DB_PASSWORD
API_TIMEOUT = env.API_TIMEOUT  # From custom loader

Need Help?

  • Documentation: For detailed guides and examples, visit the documentation
  • Issues: Found a bug? Have a question? Open an issue
  • Contribute: Pull requests are welcome!

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stela-9.0.6.tar.gz (113.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stela-9.0.6-py3-none-any.whl (20.8 kB view details)

Uploaded Python 3

File details

Details for the file stela-9.0.6.tar.gz.

File metadata

  • Download URL: stela-9.0.6.tar.gz
  • Upload date:
  • Size: 113.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for stela-9.0.6.tar.gz
Algorithm Hash digest
SHA256 bbf33a4698d35b4838a5ebbf531e32dcc7ed04a7da4f1c925d5ebba430e5d274
MD5 548d92a989321b401564c41042e1ba1a
BLAKE2b-256 17187e026063f1f352354925becba03cbaf3601d6f77696d25d2852416d1d384

See more details on using hashes here.

Provenance

The following attestation bundles were made for stela-9.0.6.tar.gz:

Publisher: publish.yml on megalus/stela

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file stela-9.0.6-py3-none-any.whl.

File metadata

  • Download URL: stela-9.0.6-py3-none-any.whl
  • Upload date:
  • Size: 20.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for stela-9.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 0e0d68e894a69d1b55e4f17faebd27d3268a9a614c98c3225e740b70ca6d7acf
MD5 ceb8401b05de53bc627fb630c8224491
BLAKE2b-256 a3f90131c4d1f74412d9075d9b71fa945d3184ee1bf03fb0778dcd0e75e5234b

See more details on using hashes here.

Provenance

The following attestation bundles were made for stela-9.0.6-py3-none-any.whl:

Publisher: publish.yml on megalus/stela

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page