Skip to main content

Local-only helper to populate and maintain a personal .env file with API tokens and identity variables

Project description

dotfill

dotfill is a local-only helper for maintaining token and identity variables in a personal .env file. It runs a Python CLI plus a localhost web UI, reads TOML configuration, and writes only after explicit user action.

Generic dotfill ships with no services, identities, domains, token names, or import aliases. A user config or a wrapper package supplies those definitions.

Installation

For CLI use, install dotfill as an isolated tool:

uv tool install dotfill

or:

pipx install dotfill

For use as a library or project dependency:

uv add dotfill

or:

pip install dotfill

dotfill requires Python 3.14 or newer.

Quick Start

dotfill status
dotfill
dotfill config path
dotfill config open

Useful options:

dotfill --config-root C:\tmp\dotfill-config --profile demo status
dotfill --env-path C:\work\project\.env

First Config From An Existing .env

For individual use, install dotfill directly and create your own config.toml. If you already have a .env, a practical first setup path is to make a copy, remove the secret values, then ask an AI coding agent to draft config.toml from the sanitized variable names using dotfill's public docs.

Do not give API tokens or other secrets to the agent. Keep only variable names and non-secret comments, for example GITHUB_TOKEN= or GITHUB_TOKEN=<redacted>. Review the generated service URLs, test URLs, auth mode, identities, and derived variables before using the config against your real .env.

See Getting started for a suggested prompt and review checklist.

Documentation

Maintainer requirements, design notes, and implementation tracking live under dev/docs/.

Configuration

dotfill loads two optional TOML files from the resolved config directory:

config_common.toml
config.toml

config_common.toml is intended for managed baseline configuration. config.toml is intended for user-owned overrides. Both files must include version = 1 when present.

See docs/config-schema.md for the complete schema.

Default config root:

platformdirs.user_config_dir("dotfill", appauthor=False, roaming=True)

Profiles live under profiles/<name> inside the config root.

Example:

version = 1
name = "Example profile"

[target]
default_env_path = "~/.env"

[identities.WORK_EMAIL]
source = "literal"
value = "alice@example.com"

[identities.WORK_USER]
source = "local_part"
from = "WORK_EMAIL"

[derived.WORK_USERNAME]
from_identity = "WORK_EMAIL"

[services.EXAMPLE]
display_name = "Example"
token_var = "EXAMPLE_TOKEN"
token_url = "https://service.example.com/users/{WORK_USER}/tokens"
test_url = "https://service.example.com/me"
tls_verify = true
icon = "key"

[services.EXAMPLE.auth]
kind = "bearer"

[import_aliases.OLD_EXAMPLE_TOKEN]
target = "EXAMPLE_TOKEN"

Set enabled = false in config.toml to disable an inherited service, identity, derived variable, or import alias.

.env Behavior

The target .env contains ordinary environment values only. dotfill no longer reads legacy service or derived-variable meta-configuration from .env; those assignments are unrelated content unless their exact names are explicitly configured as managed variables in TOML.

The parser/writer preserves comments, blank lines, unrelated variables, unrelated duplicates, and line endings. Duplicate managed variables are rejected before writes.

Local UI

dotfill starts a server bound to 127.0.0.1, opens the dashboard, and serves static assets from the installed package. The dashboard can:

  • show configured identities, derived variables, services, config directory, and target .env;
  • save service tokens;
  • fill missing enabled derived variables during token saves and import commits;
  • fill or reset individual derived variables to their computed defaults;
  • import token/derived values from another .env-like file;
  • test configured service tokens on explicit user action.

When no services are configured, the dashboard shows an empty generic state.

Privacy

  • No cloud backend, accounts, telemetry, or remote sync.
  • Raw token values are not returned by state/import APIs.
  • Dropped import values are kept only in backend session memory as secret values.
  • The browser keeps session and token input in memory only; no browser storage is used.
  • Service tests support configured bearer, header API-key, and basic auth requests only to configured test URLs.
  • Service tests verify TLS by default. Use tls_verify = false only when a configured service explicitly requires it.

Wrapper Packages

Wrapper packages are for sharing baked-in dotfill defaults with other people. For example, a team wrapper can provide managed config_common.toml content so teammates get the same services, token variable names, identity rules, import aliases, and profile policy without each person hand-writing the same TOML.

If you are using dotfill only for yourself, you usually do not need a wrapper. Install dotfill directly and create your own config.toml, profiles, services, identities, and aliases.

Wrappers launch dotfill through:

from dotfill.entrypoints import run_dotfill

raise SystemExit(
    run_dotfill(
        locked_profile="team",
        before_config_load=sync_managed_config,
    )
)

Use locked_profile when the wrapper command should always mean one profile. Use default_profile only when CLI --profile or DOTFILL_PROFILE should be allowed to select another profile. Wrappers should not import the Typer app directly. User overrides remain in config.toml.

For a complete sample wrapper repo, see dotfill-wrapper-example.

Development

From a source checkout:

uv sync
uv run pytest
uv run dotfill status
uv build

If the virtual environment is activated, dotfill --help works directly. Without activation, use uv run dotfill ... or .\.venv\Scripts\dotfill.exe ....

Project details


Download files

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

Source Distribution

dotfill-1.3.0.tar.gz (47.7 kB view details)

Uploaded Source

Built Distribution

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

dotfill-1.3.0-py3-none-any.whl (59.9 kB view details)

Uploaded Python 3

File details

Details for the file dotfill-1.3.0.tar.gz.

File metadata

  • Download URL: dotfill-1.3.0.tar.gz
  • Upload date:
  • Size: 47.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for dotfill-1.3.0.tar.gz
Algorithm Hash digest
SHA256 569f9fa7b5db29e1a905311991f96a7cb7218d618c13246d8fadf8ccb9f92a8d
MD5 20c4fe03643ff9e3e113685ff35d7657
BLAKE2b-256 7540f46b46db3aca449099ede9617b1f12693610a32d85859a4c7eb95e3038ce

See more details on using hashes here.

File details

Details for the file dotfill-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: dotfill-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 59.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.19 {"installer":{"name":"uv","version":"0.11.19","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for dotfill-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2015a60d99eda82ad433433262190ececee8524a1728dae35e416c5c1c028d01
MD5 7c03285932f4b1d3778da7b97b790860
BLAKE2b-256 6d9ec808011038393ac70ea50b6046568a9e8ca8e1145e681cbe951978041ca7

See more details on using hashes here.

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