mrkeyoor.com_
Tue 10 Nov 05:43 UTC
Dev Toolsevaluationupdated 10 Nov 2026

sops review

SOPS is an editor of encrypted YAML, JSON, ENV, INI and binary files. It supports age, PGP and several cloud key services, allowing teams to version encrypted configuration alongside code.

+46stars / 7d
Verdict

The SOPS build succeeded in 94 seconds, but the test command failed, with 9 failures in the supplied summary. Shortlist it for encrypted configuration in Git when someone owns recipient access and recovery. Before using production credentials, check a disposable file with the deployment identity and work through the documented compromise procedure. This review did not measure those operations.

We ran it

Lab card: what happened when we ran sopsScreenshot of sops (getsops.io)
Install✓ · 39s366 packages
Build✓ · 94s
Tests✗ · 33s36 passed · 9 failed of 45 (go test)
Repo156 files~28,023 lines of source · 1.1 MB · 5 CI workflows

Answers from our run

Does sops build from source?

Dependencies installed in 39 seconds (366 packages), and the build succeeded in 94 seconds. We cloned commit 86bc0b0 into a clean Debian container with 3 CPUs and no project-specific setup.

Do sops's tests pass?

No. The project's own test command finished in 33 seconds and reported 36 passed, 9 failed (go test).

Who should not use sops?

Teams that must hide configuration field names: the documented structured-file example leaves names readable.

What are the alternatives to sops?

age, git-crypt. The SOPS build succeeded in 94 seconds, but the test command failed, with 9 failures in the supplied summary.

SetupN/AInstallation and build timings were recorded, but recipient setup and deployment access were not exercised.
DocsN/ASupplied excerpts explain editing, configuration discovery and rotation, but a complete deployment walkthrough was not assessed.
CommunityN/ARepository metadata and a short activity feed do not establish support responsiveness or maintainer capacity.
MaturityN/AThe successful build and failed test command do not assess deployed secret delivery, recovery or sustained operation.

Discussed on

  1. hnDo not encrypt comments in SOPS3 points

Who it’s for

Teams that want encrypted configuration reviewed and versioned beside application code.
Operators with an existing cloud key service or a deliberate process for distributing age or PGP identities.
Maintainers prepared to own recipient changes and recovery procedures.

Who it’s NOT for

Teams that must hide configuration field names: the documented structured-file example leaves names readable.
Operators expecting a configuration edit alone to complete a compromise response: the documented procedure also updates encrypted files and rotates their data keys before replacing the secrets inside.
Teams without an owner for encryption identities, deployment access and recovery.

Setup reality

The October 9, 2026 sandbox run at commit 86bc0b0 installed SOPS in 39 seconds with 366 dependencies recorded and built it in 94 seconds. Tests exited 1 after 33 seconds: the supplied Go summary records 36 passed and 9 failed out of 45. The visible tail names KMS and PGP failures without explaining their causes.

Using SOPS requires access to the configured decryption identities. Cloud-backed setups need the relevant credentials and permissions; local identities need a distribution and recovery process. SOPS searches for .sops.yaml from the current working directory upward, or accepts an explicit configuration path.

The recorded sandbox configuration was 3 CPUs, 8 GB RAM and image golang:1.24-bookworm. The image label does not establish the actual runtime or operating-system version. Deployment and recovery were not measured.

SOPS puts recipient management alongside encrypted configuration

SOPS lets teams version encrypted configuration beside application code. Its documented YAML example leaves field names readable while values appear as ciphertext. That gives reviewers some document structure, but it also exposes the names of settings. Choose this workflow only if that disclosure fits your requirements and someone owns the identities used to decrypt the files.

The SOPS README lists YAML, JSON, ENV, INI and binary formats, with encryption through age, PGP and several cloud key services. These are documented capabilities, not deployment paths exercised by this review.

What happened when we ran it

Our SOPS build succeeded in 94 seconds. Installation succeeded in 39 seconds, with 366 dependencies recorded. The sandbox run used commit 86bc0b0 on October 9, 2026. Tests exited 1 after 33 seconds, with the supplied Go summary recording 36 passed and 9 failed out of 45.

The visible log tail names github.com/getsops/sops/v3/kms and a failing TestPGP in the pgp package. It also shows successful package results for Shamir handling and the dotenv, INI, JSON and YAML stores. It does not explain the failures. Missing credentials, GnuPG problems and a code regression would all be unsupported diagnoses.

The recorded sandbox configuration was 3 CPUs, 8 GB RAM and image golang:1.24-bookworm. Actual runtime and operating-system versions require the raw toolchain logs. A successful build followed by a failed test command leaves deployment and secret recovery unverified.

Check what the encrypted document exposes

The documentation's first-steps example shows readable YAML names such as user and password beside encrypted values. If a field name reveals a sensitive integration or purpose, encrypting its value does not conceal that name. Inspect a disposable encrypted document before deciding who should be able to read the repository.

The documented editing workflow opens decrypted content in an editor. SOPS waits for that editor to exit before trying to re-encrypt the file. The documentation warns that some GUI editors spawn a child process and exit immediately, and says they usually have an option to wait. Check that behavior for the editor you intend to use. Editor temporary files and endpoint access controls were not assessed here.

Make configuration discovery deliberate

SOPS looks for .sops.yaml in the current working directory and its parents, using the first file it finds. The documentation also permits an explicit path through --config or SOPS_CONFIG. Scripts should therefore set their working directory or configuration path deliberately rather than assume discovery begins beside the encrypted file.

Before adoption, use a harmless file with the intended recipients. Commit the encrypted result, check decryption with the deployment identity, and check that an identity outside the intended group cannot decrypt it. These are recommended acceptance checks, not operations completed by the sandbox run.

Protect replacement credentials after a compromise

The documented compromise procedure removes the affected key from its key group in .sops.yaml, runs updatekeys on each affected encrypted file, rotates the file's data key, and commits and pushes the updated file. Only afterward does it tell operators to replace the passwords, API keys and other secrets inside.

That order protects subsequently encrypted replacement credentials from the compromised recipient. It does not erase access to previously obtainable ciphertext or secrets. Treat recipient changes and replacement of exposed credentials as separate tasks, and assign someone to find the affected files and complete the documented sequence.

This responsibility is a reason to avoid SOPS when nobody owns recovery and offboarding. Keeping encrypted files in Git does not carry out those procedures for the team.

Consider the alternative's access model

age is a file-encryption tool, format and Go library. The age README documents encryption for explicit recipients. Consider it when encrypting an entire file covers the job and you do not need SOPS's configuration-editing workflow. SOPS also supports age recipients, so the decision concerns how you want to handle documents as well as which identities you use.

git-crypt encrypts selected files when committed and decrypts them when checked out. The git-crypt README documents Git filters for this workflow. Consider it when encryption should accompany ordinary Git operations, but account for its access limitation before choosing it: git-crypt does not support revoking previously granted repository access or rotating its encryption key. Its README explains that a holder of an earlier key can still access earlier repository history.

Neither alternative was measured alongside SOPS. There is no comparative speed or reliability result here. For SOPS, the useful next step is the disposable-file acceptance exercise with your actual deployment identity and a named owner for recovery.

Alternatives

ProjectWhat it isPick it when
ageA file-encryption tool, format and Go library.Consider it when whole-file encryption for explicit recipients covers the job and you do not need SOPS's configuration-editing workflow. It was not measured here.
git-cryptEncrypts selected Git files on commit and decrypts them on checkout.Consider it when encryption should accompany ordinary Git operations through repository filters. Its README says previously granted repository access cannot be revoked and key rotation is unsupported; earlier key holders can retain access to repository history. It was not measured here.

Sources

  1. SOPS README
  2. SOPS documentation
  3. age README
  4. git-crypt README

More dev tools reviews

folly · universal-android-debloater-next-generation · OpenSandbox · You-Dont-Know-JS · evilginx2 · google-colab-cli · the whole board →