Skip to content
PN Scripts

Developer tools

Keytally by PN Scripts

A command-line tool that finds the same secret in two environments (staging and production) and secrets still equal to the .env.example value or a placeholder, and also tracks how long each secret has gone unchanged, without ever printing a value. It still compares .env.example with your real files by key name.

  • Go
  • dotenv files
  • PBKDF2-HMAC-SHA256
  • JSON
  • GitHub Actions annotations
  • Coming soon

Coming soon

Not published on its store yet, so there is no buy or download link. PN Scripts does not take payment for it here.

Keytally reuse reporting a database password shared by staging and production, a placeholder and a secret copied from the example file, with key names only

What it solves

The gap

A staging copy of a production secret, a changeme that reached production and a database password nobody has rotated in two years are the env-file problems that become incidents, and the usual way to find them is to open the files, which puts secrets on screens and in logs.

What it is

Keytally compares secret values between your env files inside its own memory and reports only key names and line numbers; as a supporting check it keeps a ledger of salted hashes outside the project to tell how long each secret has gone unchanged.

How you use it

Know which secrets are shared, unfinished or overdue for rotation without a single value reaching a screen or a log.

Env checkers mostly ask whether a key exists or whether a value looks weak inside one file. Keytally compares the secrets themselves across your files: the same value in staging and production, a value copied from .env.example, and, as a supporting check, how long it has gone unchanged.

Who it is for

Use it when

  • A CI step that fails when a production secret has been copied into a staging env file, or a changeme or example value has reached a real env file
  • A quarterly check that lists every secret not rotated for 90 days
  • Reviewing env files in a screen share or a log without revealing any secret

Built for

  • Web and backend developers whose projects use .env files
  • DevOps engineers who maintain deployment configuration and CI pipelines

What is inside

Shared, copied and unfinished secrets

keytally reuse takes the .env files of the folder, or the files you name, and the example file for comparison. A secret value found in two files is an error, because a leak of staging then opens production. A placeholder such as changeme or <your-key>, or a value still equal to the one in .env.example, is an error. One value behind two keys of a file and a secret under eight characters are warnings. Secrets are picked out by key name (PASSWORD, TOKEN, SECRET, API_KEY and similar, but not PUBLIC_KEY or SITE_KEY) and by long random-looking or URL-embedded values.

How long each secret has gone unchanged

keytally seal stores a salted PBKDF2 hash of each secret and the date it first appeared. A changed value starts a new clock; an unchanged one keeps its date. keytally age then fails when a secret has not changed for --max-age days (90 by default), notes values that changed but were not sealed and secrets not yet in the ledger, and exits with 1 so a scheduled CI job can nag. The ledger lives in your cache folder with mode 0600 and is not meant for version control; hashes of short or guessable secrets can be guessed by whoever steals the file, which is why weak secrets are reported separately.

Built never to show a value

Values are held in memory only while the files are compared. Findings contain key names, file names and line numbers, and broken lines are described by fixed messages. A test runs reuse, seal and age in every output format over files full of marker values and fails if a marker appears in the output or in the ledger file.

The key-name check is still here

keytally .env.example .env.staging reports missing, extra, empty and duplicate keys and invalid lines with line numbers and a hint for a likely typo, in text, JSON or GitHub annotations. --strict, --ignore and the empty-value switches decide what fails the run.

Specs

Availability
Coming soon
Vendor
PN Scripts
Type
App
Platforms
Go
Pricing
One-time purchase Price to be announced.
License
Proprietary
Deployment
Download (static binaries for Linux, macOS and Windows, with source code)
Maturity
v2.0.0

Compatibility

Platform or runtime Supported versions Tested up to
Linux amd64 kernel 3.2 (Go 1.26 minimum) or newer Ubuntu 24.04, kernel 6.8
Linux arm64 kernel 3.2 (Go 1.26 minimum) or newer built, not run
macOS arm64 macOS 12 (Go 1.26 minimum) or newer built, not run
Windows amd64 Windows 10 (Go 1.26 minimum) or newer built, not run

Stack

  • Go
  • dotenv files
  • PBKDF2-HMAC-SHA256
  • JSON
  • GitHub Actions annotations

Keytally by PN Scripts is coming soon

It is finished and tested. It is not on sale yet; this page will say where to get it when it is.

Coming soon

Not published on its store yet, so there is no buy or download link. PN Scripts does not take payment for it here.

Questions

A command-line tool for env files. It finds secrets shared between environments, secrets that are placeholders or copied from the example file, and secrets unchanged for too long, and it also compares .env.example with real files by key name. It never prints a value. The ledger of rotation dates lives in your user cache folder, outside the project, with mode 0600: for each secret it holds the file, the key name, the date the current value first appeared and a salted PBKDF2-HMAC-SHA256 hash, not the secret itself, so keep it out of version control.

Only the binary for your system: Linux amd64 or arm64, macOS on Apple silicon, or Windows amd64. The Linux amd64 build was tested on Ubuntu 24.04; the others were cross-compiled but not run. Building from source needs Go 1.22 or newer.

It does not check whether a secret is valid with the service that issued it, does not rotate secrets, does not scan source code or git history for leaked keys and does not edit your files. There is no Intel macOS binary and the binaries are not code-signed.

Keytally is written in Go using only the standard library. Its tests use fixture files whose values are fake markers and cover the parser, every kind of finding of the key-name check and of the secret checks, the ledger and its dates, file discovery, the options, all output formats, exit codes and a leak test across every command and format. Created with AI assistance; the secret checks, the ledger and the promise that no value is printed were tested by PN Scripts with automated Go tests on fake fixture files and demo runs on Linux amd64.

It is not on sale yet. When it is, this page will link to the store; PN Scripts does not take payment on this site.