You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Release pipeline pins the Rust toolchain via rust-toolchain.toml.
v0.3.1 declared rust-version = "1.95.0" but cargo-dist's Linux build
jobs run on ubuntu-22.04 GHA runners, whose pre-installed Rust was
1.94.1 (and the aarch64 runner image was on 1.93.1). The MSRV check
failed and the GitHub Release for v0.3.1 was never published with
binaries (crates.io still has v0.3.1, but curl ... | sh couldn't
fetch a v0.3.1 release). v0.3.2 ships a top-level rust-toolchain.toml
so rustup auto-installs and selects 1.95.0 inside the runner regardless
of what's pre-baked. We deliberately stay on ubuntu-22.04 to keep the
Linux binaries linked against an older glibc (Ubuntu 20.04 / Debian 11
/ RHEL 8 still work). v0.3.1 has been yanked from crates.io.
Install envroll 0.3.2
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/AdriiiPRodri/envroll/releases/download/v0.3.2/envroll-installer.sh | sh
envroll save now persists comment-only edits and any other
byte-level change to the working copy. Previously save compared
the parsed key-value map of the working copy against the env's last
commit and printed envroll: nothing to save whenever only comments,
blank lines, or key order had changed, so adding a documentation
comment and running save silently dropped the edit. The new
comparator is byte equality against the decrypted plaintext of the
tip, so any difference (added comment, blank line tweak, key
reordering, value change) produces a real commit whose plaintext
preserves your edit verbatim. The blob has always stored the working
copy bytes as-is, so this only changes the no-op detection rule and
matches what users intuitively expect when they edit .env and run envroll save. Editor quirks like auto-added trailing newlines or
line-ending normalization will produce a one-shot commit on first
save and stabilize from there.
Install envroll 0.3.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/AdriiiPRodri/envroll/releases/download/v0.3.0/envroll-installer.sh | sh
Unquoted multi-word values in .env files are now accepted on read.
Files routine in python-dotenv / Django setups, e.g. DEFAULT_FROM_EMAIL=Display Name <a@b.com>, used to fail with parse error: ... error at line index: N because dotenvy rejects
whitespace inside unquoted values. envroll now applies a small
tolerance pre-pass that auto-quotes such values with the four standard
escapes (\\, \", \$, \n) before handing the buffer to dotenvy. Already-quoted values, comments, and lines inside an open
multi-line quoted block are passed through verbatim. The serializer
still emits canonical KEY="value" form, so the in-vault bytes are
unchanged.
Install envroll 0.2.2
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/AdriiiPRodri/envroll/releases/download/v0.2.2/envroll-installer.sh | sh
README now embeds a programmatic VHS-recorded demo (~80 seconds)
covering init, fork, set, save, use, exec, diff, log,
and list. Click the GIF to open the MP4 with pause/scrub controls.
Source tape lives at docs/demo.tape; regenerate with vhs docs/demo.tape.
Releases auto-publish to crates.io on every vN.M.P tag push —
no more manual cargo publish. The new .github/workflows/publish-crates.yml workflow runs in parallel with
cargo-dist's release pipeline and validates that the tag matches Cargo.toml's version field before publishing, so a mismatch fails
loudly instead of silently shipping the wrong version.
Install envroll 0.2.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/AdriiiPRodri/envroll/releases/download/v0.2.1/envroll-installer.sh | sh
envroll is now on crates.io. Install with cargo install envroll
from any machine that has a Rust toolchain — no need to grab a
prebuilt binary or build from source. The published crate ships the
same envroll binary the GitHub Releases pipeline produces.
Changed
The crates.io tarball is trimmed to what consumers actually need.
The CI workflow (.github/workflows/), cargo-dist config
(dist-workspace.toml), and integration tests (tests/) live on
GitHub for anyone who wants them but no longer ship inside the
published crate. Bundle size dropped from 61 → 52 files
(516 → 422 KiB uncompressed).
Test files are now organized by command/feature area instead of
by release version. The old tests/v0_1_3_features.rs (which had
already grown past v0.1.3 with v0.1.4's --install tests) is split
into tests/completions.rs, tests/import_export.rs, and tests/rename_key.rs. No behavioral change — same 27 tests, same
coverage.
Note on versioning policy
This is the first release that follows the semver policy correctly for
a 0.x crate: new features get a MINOR bump, not a PATCH. The
0.1.0 → 0.1.5 history shipped multiple feature releases as patches
(basename project IDs, --target, completions, import/export,
rename-key, --install) — those tags stay as published, but every
release from here on gets the right bump. Bug-fix-only releases will
be 0.2.x; the next batch of features will be 0.3.0.
Install envroll 0.2.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/AdriiiPRodri/envroll/releases/download/v0.2.0/envroll-installer.sh | sh
envroll completions <shell> --install — one command that figures
out the convention path for your shell, creates whatever directories
are missing, writes the completion file, and (for shells that need it)
appends a marker-guarded block to your shell's rc file so completion
loads on next shell start. No sudo, no manual .zshrc editing.
Idempotent — re-running doesn't duplicate anything.
The plain envroll completions <shell> form (print-to-stdout) still
works for CI / container builds / users who want to wire it manually.
Changed
README's Shell completions section rewritten to lead with --install. The "manual" path is documented as a fallback for custom
setups (system-wide /usr/local/share/zsh/site-functions/, etc.).
Fixed
Documentation no longer assumed /usr/local/share/zsh/site-functions/
exists by default — most fresh macOS installs don't have it. The --install flow uses ~/.zsh/completions/ instead and creates the
directory as needed.
envroll completions <shell> — print bash / zsh / fish /
powershell / elvish completion scripts to stdout. (See 0.1.4 for the
one-command install variant.)
envroll import <file> --as <name> — adopt an existing .env-style file lying around on disk as a new env in the current
project. Onboarding accelerator: when a new contributor arrives with
five legacy .env.dev / .env.staging / .env.bak.2024 files, they
can now for f in .env.*; do envroll import "$f" --as "${f#.env.}"; done
instead of shuffling files in and out of ./.env.
envroll export <env> [--output dotenv|json|shell] —
anti-lock-in escape hatch. Decrypts a single env to stdout in one of
three formats: dotenv (the default — round-trips through import), json (single object, ready to pipe into AWS Secrets Manager), or shell (POSIX-safe export KEY='...' lines, eval-able). Never
masked.
envroll rename-key OLD NEW [--in <env> | --all] [--force] —
rename a key (e.g. DATABASE_URL → DB_URL) across one or every env
in the project. Skips envs that don't contain OLD; refuses on
collisions unless --force.
Changed
--format is no longer the flag for envroll export's output shape
(it conflicts with the global --format human|json flag). Use --output dotenv|json|shell instead.
envroll init --target <filename> — register a project with a
non-default working-copy filename. Designed for modern JS frameworks
that read from .env.local (Next.js, Vite, Astro, Remix, Nuxt) or any
other custom path (application.env for Spring Boot, config/.env
for apps with config in subdirs). Once set, every command (fork / save / use / status / etc.) reads and writes the configured
filename instead of .env.
Validation rejects empty, absolute, or path-traversal filenames at init time.
Changed
Manifest schema gains a target_filename field.
Fixed
Manifests created by 0.1.0 / 0.1.1 (which didn't have the field) are
fully backwards-compatible — serde defaults the field to .env so
existing vaults keep working.