Safeguard
Supply Chain•

What is a Go pseudo-version and is it safe to depend on?

A Go pseudo-version names an exact commit when no release tag exists. Learn how to read one, why it is reproducible, and when to replace it with a tag.

Safeguard Security Team
3 min read

A pseudo-version is Go's version string for a specific commit that has no semantic version tag. It encodes a base version, a UTC timestamp and a 12 character commit hash. It is reproducible, but it signals unreleased code, so treat it as a debt to repay with a tagged release.

How to read one

The Go reference lists three forms. The most common for a module with releases looks like this:

v1.2.4-0.20191109021931-daa7c04131f5
PartMeaning
v1.2.4-0Base: the next patch after the latest tagged release
20191109021931UTC time of the revision (commit time in Git)
daa7c04131f512 character commit hash prefix

Go checks these parts. A base version needs a tagged ancestor, the timestamp must match the revision, and the revision must be an ancestor of a branch or tag in the repository.

How you end up with one

Run go get example.com/mod@bugfixes or @4cf76c2 and the go command translates the branch or hash into a pseudo-version in your go.mod. The Go documentation uses this for testing commits before version tags exist.

Is it safe?

The commit hash pins the content, so the build is reproducible and the checksum database still covers it like any other version. The risks are about maintenance, not integrity:

  • No release process stood behind that commit. Nobody promised it is stable.
  • Fixes are harder to track, because advisories usually reference tagged versions.
  • Tools that compare versions to advisory ranges can misjudge a commit between tags.
  • A pseudo-version often points at a fork or a fix branch that may never be merged.

Decision guide

  1. Is there a release that includes the commit? Move to it with go get example.com/mod@v1.3.0.
  2. If not, ask the maintainer for a tag, and note the issue link in your pull request.
  3. If you must keep the pseudo-version, record why in a comment and set a review date.
  4. List all pseudo-versions in your project and check how old each is: look for the timestamp in the string, which gives you the age at a glance.

You can list every module version with go list -m all and filter for versions containing a long digit run.

Where Safeguard fits

Safeguard's dependency scanning and SBOM output record the exact module versions in use, including pseudo-versions, and policies can gate on findings. A free scan will show your inventory.

Quick check

Does a pseudo-version point to a fixed commit?

Yes. The last part is a 12 character commit hash prefix, and Go validates the timestamp against the revision.

Can I read the commit date from it?

Yes. The middle part is the UTC timestamp of the revision.

Sources

Last reviewed: 19 October 2026.

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.