Extension age

Check D2 · provenance family · automatic · one of the 11 Docker Desktop checks

The question this check asks: how long has the Docker Hub repository behind this extension existed? A Docker Desktop extension is a Hub image, and the Hub records the day its repository was created. That date is the cheapest provenance the extension carries and the one an attacker can do least about: a repository registered last week has been registered for a week, whatever its tag says.

Why it matters

An extension installs with the rights of the Docker Desktop user — Docker's own overview of 21 April 2026 says extensions have direct access to the Docker Engine, can read and write the filesystem and can install and run native binaries. The question before installing one is therefore how much history stands behind it, and the repository's age is the first answer. On this platform it is also a sharper answer than on most. Docker paused new marketplace submissions on 16 June 2026 — the publish page says submissions are paused while Docker reviews marketplace security, with no resume date published — so the index RepoGates reads is a frozen list of 50 extensions, the youngest of which was registered on 17 May 2024. A repository under 30 days old cannot be in it. It reaches a machine only by image reference, through docker extension install, after the user has turned off the marketplace-only setting that has been the default since Docker Desktop 4.31.0 (6 June 2024) and turned extensions on at all, which have been off by default since 4.74.0 (19 May 2026). Docker's overview is plain about what that path carries: extensions installed outside the marketplace "have not been reviewed at all". No malicious Docker Desktop extension has been publicly reported as of 18 September 2026; the check exists for the image that arrives that way.

How RepoGates scores it

D2 reads one field of the Hub repository record, date_registered from /v2/repositories/{owner}/{name}/, and counts the days to now. Under 30 days (dde_ext_age_high_days) the finding is dde-ext-age, HIGH, 12 points, and its text carries the count: "repository registered 9 days ago — younger than 30 days". It is not graded on the listing, because a repository that young cannot be listed. The scoring table's evidence note:

"D2; mirrors repo-age"

The same date does a second job. Four other checks — the publisher badge (D1), host binaries (D6), the VM backend (D7) and the source label (D8) — are graded on a state the code calls settled: listed in Docker's index and at least 90 days old (dde_established_days). Under 90 days they report the marketplace's ordinary shapes as findings rather than notes. So a repository 45 days old gets no D2 row, and still reads REVIEW on what the others say.

The verdict engine is the one behind all 11 Docker Desktop checks: any CRITICAL finding is a BLOCK, any HIGH or MEDIUM finding is a REVIEW, and a report with nothing above INFO is a PASS. The score is 100 minus every fired penalty, floored at zero. A nine-day-old repository fires D2 and, by construction, D5's dde-unlisted: 27 points, a score of 73 and a REVIEW before the publisher or the install surface has said a word. On the personal-default profile a HIGH is a warning and an ask before docker extension install runs; on org-strict every HIGH is a block. D2 feeds the Clone dimension with D1, D3–D5, D8 and D10; a dimension takes the worst of its checks and reads PASS only when every one of them ran.

False positives we know about

On the marketplace as it stands, none. In the 18 September 2026 measurement of all 50 listed extensions, run locally through the same code as /v1/dde/score, D2 fired on nothing: the youngest repository (docker/labs-vscode-installer, registered 17 May 2024) was 853 days old, the median 1,447 — four years — and the oldest, docker/disk-usage-extension and tailscale/docker-extension, date from 18 and 19 January 2022. On this frozen marketplace the check is a note-taker that has nothing to note. It becomes a finding on the image that is not in the index.

Where the cost lands is stated rather than hidden: a genuinely new extension, listed or not, is HIGH on this check for its first 30 days and REVIEW on the graded checks until its ninetieth. A vendor who ships a private extension to its own developers from a fresh Hub repository sees exactly that, with dde-unlisted beside it, and the fix is the calendar. A publisher who moves an established extension to a new repository name starts the clock again, because to the Hub it is a new repository. The check reads the record as it is today, so nothing needs re-running: the finding expires on its own.

What this check does not cover

The age of the repository is not the age of the image. A tag can be pushed today onto a repository from 2022 and D2 will call it old; the push date is D10's field, and what the latest tag points at is nobody's until the registry is read. Since Docker Desktop 4.77.0 (8 June 2026) marketplace installs are pinned to a manifest digest, so a listed extension updates only when Docker's index does; a sideloaded reference is whatever its tag points at on the day. Nor is the repository's age the publisher's — a namespace from 2015 can register a repository this morning, which is why D1 reads the account's join date separately. The date says nothing about the contents: the labels, the metadata and the layers are other checks' evidence.

RepoGates assesses a Docker Desktop extension on request — through the API, the MCP server (platform="dde") and the preflight for docker extension install. It does not see an extension installed from Docker Desktop's own Extensions Marketplace tab, which is the app's own fetch; the board inside Docker Desktop is not built, and cannot be — its marketplace is a native window no browser extension sees. The image is never pulled and its code is not read: a PASS means the provenance and the declared install surface are clean, never that the backend or the host binaries were inspected.

Check it yourself

The Hub API answers without a token. The repository record carries the registration date this check reads and the push date it does not; the tags endpoint says when the latest tag itself was last pushed:

curl -s https://hub.docker.com/v2/repositories/tailscale/docker-extension/ \
  | jq '{date_registered, last_updated, pull_count}'
curl -s 'https://hub.docker.com/v2/repositories/tailscale/docker-extension/tags?page_size=1&ordering=last_updated' \
  | jq '.results[0] | {name, last_updated, full_size}'

Tailscale's answers 19 January 2022 for the first and a tag pushed in April 2026 for the second: an old repository, recently maintained. Then ask RepoGates for the whole report with a personal API token from the account page:

curl -s -H 'Authorization: Bearer rgp1.…' \
  https://api.repogates.com/v1/dde/score/tailscale/docker-extension \
  | jq '{verdict, score, age: [.findings[] | select(.check == "dde-ext-age")]}'

From an agent, check_repo("tailscale", "docker-extension", platform="dde") on the MCP server returns the same report; in Claude Code with the plugin installed, a Bash line of docker extension install tailscale/docker-extension is sent to the preflight before it runs. Read the date beside the pull count (D3) and the index (D5): registered this month, thousands of pulls already, and not in the list is the shape the provenance family exists to name.

Questions

Why 30 days? Because the threshold mirrors the GitHub repository-age check and the Hugging Face and VS Code Marketplace ones, and because on this platform a repository under 30 days old cannot be listed: Docker paused new marketplace submissions on 16 June 2026, so the 50-entry index is frozen and the youngest listed repository was registered on 17 May 2024, 853 days before the measurement. A repository registered last week is by construction sideloaded or private, and D2 arrives with the marketplace-listing check's own finding beside it.

Does a new version reset the clock? No. D2 reads date_registered on the Hub repository record — the day the repository was created — not the date of the latest push. A tag pushed this morning on a repository from January 2022 is old to this check; the push date is D10's field. The clock starts again only when the extension moves to a new repository name, which makes it a new repository to the Hub as well.

What does a young repository mean for the other checks? More than its own 12 points. The publisher badge, host binaries, VM backend and source-label checks are graded on a state the code calls settled — listed in Docker's index and at least 90 days old. Under 90 days those four report the marketplace's ordinary shapes as findings rather than notes, so between the 30th and the 90th day D2 itself is silent while the report is still REVIEW on what the others say.

Related checks

D1 Publisher — the account's age rather than the repository's, and the first of the checks this one's 90-day line grades · D3 Traction mismatch — the pull count read against this same date · V2 Extension age — the same question on the VS Code Marketplace · C2 Repository age — the GitHub check this one mirrors.

Add RepoGates to Chrome Pricing

Numbers on this page: the 18 September 2026 measurement of all 50 extensions in Docker's marketplace index, run locally through the same code as the API, and their Docker Hub records as read the same day; Docker Desktop release notes for 4.31.0, 4.74.0 and 4.77.0 and the Extensions overview of 21 April 2026, as read on 18 September 2026; weights from the product's scoring table.