Methodology

How we measure ship status.

OSSEAN reports one number about 598 repositories: when GitHub last saw a push. Everything else on this site — the counts, the badges, the leaderboard — is that one number and a date. This page is the whole method, including the parts that make it weaker.

Current snapshot: 2026-08-11 · 598 repos · schema v2.

The honest-claims contract

What we claim, and what we refuse to claim.

This is the contract the product is built against. It is published as written, not summarised, because the limitations are the point.

  • The measured quantity is pushed_at from the GitHub API: the last time any branch of the repository received a push. Everywhere in the product it is phrased as “last verified push,” never “actively maintained,” “healthy,” or “alive.”
  • A push is not a release, a commit is not a feature, and a merged PR is not a shipped product.
  • Bot pushes count. Dependabot, translation sync bots, gh-pages deploys, and generated-docs commits all bump pushed_at. We do not filter them and we do not claim to.
  • A quiet repo may be a finished one. A stable library with no open work reads as silent here. That is a limitation of the metric, stated as such on the badge tooltip and the detail page.
  • Development can move. Work migrating to a monorepo, a fork, or a private mirror shows as silent even though the product ships. The directory records the repo it was pointed at.
  • The score is trivially gameable by pushing an empty commit daily. Mitigations: pushBits caps at 25 of 100 points; the release component needs a real tagged release; the roster is frozen so there is no ranking to buy into; and score is never the default sort (stars are). We publish the algorithm rather than pretending it is hard to game.
  • Snapshot age is always visible: lastGoodAt renders as “verified {relative}” and any repo with lastGoodAt older than 3 days is labelled unverified, not guessed.
  • License status is GitHub’s license.spdx_id, not legal advice. 23% of the directory is NOASSERTION/null and is shown as “license unknown,” never as “open” or “closed.”

In the snapshot of 2026-08-11 that last figure is 25% — 147 of 598 repositories carry no license GitHub can parse.

Thresholds

Four states, 30 and 120 days.

Days are counted from pushed_at to the snapshot’s own timestamp — never to the day you happen to be reading. The two cut-offs sit on a real cliff in the data: about four in five repositories clear 30 days, and the next three months add only a few percent. Archived, disabled, and deleted repositories are forced to silent whatever their last push says.

StateRuleIn this snapshotWhat it does and does not mean
Still shipping≤ 30 days since the last push459Someone pushed to some branch inside the window. Not a release, not a feature.
Slowed31–120 days42Quiet, not gone. A deliberately thin transition band.
Gone silent> 120 days, or archived, disabled, or deleted96No push in four months. Some of these are finished, not dead.
Unverifiedour own fetch has failed for 3+ days1We could not ask GitHub, so we do not answer. This is not a judgement about the repo.

Counts are as of the snapshot of 2026-08-11, not today.

Ship score

0 to 100, and how each point is earned.

The score exists for ranking and sorting only. Status stays threshold-driven so it can be explained in one sentence. Four parts add up, every input is a stored field, and the whole thing is recomputable from the published snapshot — a threshold change is a rerun, not a re-fetch.

Recency — up to 55 points
Halves every 45 days since the last push. A repo pushed today gets the full 55; at 45 days it has 27, at 90 days 14.
Cadence — up to 25 points
How many of the last 32 daily checks saw a new push. Twenty days out of the window is full marks. This is the part an empty daily commit can farm, which is why it is capped at a quarter of the score.
Releases — up to 12 points
Halves every 180 days since the latest tagged release. Unknown scores zero rather than a penalty, so a project we have not checked for releases is never punished for our gap.
Openness — up to 8 points
8 for an OSI-approved license, 4 when GitHub cannot parse one, 0 otherwise. Archived, disabled, or deleted repositories score 0 overall regardless of the other three parts.

Where the data comes from

One GitHub call per repo, once a day.

The directory is a frozen roster of 598 repositories. A daily job maps over that list, asks the GitHub REST API for each repository, and writes one snapshot file — the same file this page, the homepage, and every badge read from. The list only changes when a human opens a pull request, so nothing can quietly enter or leave the ranking.

When a fetch fails we keep the last good record and mark the repository unverified after 3 days rather than letting an old number pass as current. Star and fork counts on a detail page can be refreshed live from your own browser; the ship status stays pinned to the snapshot, because that is the number we can date.