Starling
← Back to the board
About · the method

How a repo becomes "trending"

Starling doesn't guess. Every repository on the board earned its place through the same arithmetic, applied identically to every repo, every day. Here's exactly how it works — the whole calculation, with the math.

The raw material: one snapshot a day

Once a day, Starling records the star count of every public GitHub repository with at least 500 stars — roughly 120,000 of them. Over time this builds a daily history for each repo. "Trending" is entirely a question of how that number changed, so everything below is built from these daily snapshots.

The 500-star floor matters: it filters out tiny repos where a handful of stars would look like explosive percentage growth. Every repo compared is already established.

The symbols

S_nowthe repo's star count today (the latest completed crawl) S_baseits star count at the start of the window Aabsolute gain — stars added Ppercentage gain — the growth rate dthe actual number of days between the two snapshots

Three windows

The same repo is judged over three time spans, so a slow-burn climber and an overnight sensation both get surfaced. Each window looks back a fixed number of days (L):

WindowLooks back (L)
Today1 day
This week7 days
This month30 days

Two measures of the rise

For each repo and each window, Starling computes two numbers — how many stars it added, and how fast that is relative to its size:

A = S_nowS_base
absolute gain — stars added over the window
P = ( S_nowS_base ) / S_base
percentage gain — the growth rate

Percentage is the star of the show. A repo going 500 → 650 (+30%) is more genuinely "trending" than one going 50,000 → 53,000 (+6%), even though the second added more stars. Ranking by percentage surfaces the risers, not the giants.

The eligibility gate

Percentage alone is noisy, so a repo has to clear both a percentage bar and an absolute-stars bar to qualify — a real rate of growth and a real number of stars. The two bars per window:

AA_min and PP_min
a repo appears only if BOTH conditions hold
WindowMin stars gained (A_min)Min growth (P_min)
Today151%
This week755%
This month20012%

Ranking the qualifiers

Every repo that clears the gate is ranked, and the top 50 in each window make the board. The ranking score is the percentage gain — with one adjustment for the daily window:

week / month: score = P
day: score = P / max( d, 1 )
the day window divides by elapsed days, so a multi-day catch-up isn't mistaken for a one-day spike

Ties are broken by absolute gain (A), then by current star count (S_now).

A worked example

Take bojieli/ai-agent-book on a recent day — the actual #1 on the daily board:

S_now = 3,463 S_base = 2,392 d = 1
A = 3,463 − 2,392 = 1,071 stars
P = 1,071 / 2,392 = 0.4477 = 44.8%
gate: 1,071 ≥ 15 ✓ and 44.8% ≥ 1% ✓ → qualifies
score = 0.4477 / max(1, 1) = 0.4477 → ranked #1 that day

Handling the messiness of real data

Snapshots aren't always perfectly regular. Three rules keep the math honest:

The whole thing, start to finish

  1. Take today's star count for every repo (S_now).
  2. For each window, find its baseline (S_base) — the latest complete snapshot at or before L days ago.
  3. Compute the absolute gain A and the percentage gain P.
  4. Keep only repos where both A ≥ A_min and P ≥ P_min.
  5. Rank the survivors by score, take the top 50, and show them.
These numbers are calibrated, not carved in stone. The thresholds above are sensible starting points, tuned as real data accumulates — so the exact bars may shift over time as the definition of "trending" is sharpened against what the data actually looks like.
★ Starling · back to the board · summaries written by Google Gemini from each repo's README · source on GitHub