Transparent, dependency-free GitHub star-trajectory classifier — growth phase + a calibrated 100-star/48h projection with per-rule evidence.
Project description
star-trajectory
A transparent, dependency-free GitHub star-trajectory classifier. One Python file, no token, no install — point it at a repo and get its growth phase and a calibrated projection of whether it will reach a target (default 100★ in 48h), with every rule explained.
$ python3 classify.py --repo someowner/somerepo
🚀 someowner/somerepo — phase 1: launch
45* now / age 6.5h / pushed 1.0h ago
v_avg 6.95 / v_recent 11.19 pt/h / accel x1.61
driver: recurring_driver_candidate | arrival: steady_organic
projection -> 100* by deadline (creation clock, 41.5h left, decel x0.8): HIT_lean ~417*
note: direction robust; magnitude +-~30% (single-velocity projection)
JA — GitHub repo の star 成長を phase (launch / accel / sustain / maturity) に分類し、「作成+48時間で100★に届くか」を予測する、透明・依存ゼロのツールです。 トークン不要、1ファイル、すべての判定根拠を表示します。確率値ではなく方向(HIT/ BORDERLINE/MISS)で出し、外れも含めて公開実績で自己採点します。
We grade ourselves in public
This isn't just a tool — it runs as a public prediction engine. Every day it picks young, still-undecided repos, predicts their 48h fate before it's known, and scores itself once the deadline passes. The running track record — including the misses — is here:
→ PREDICTIONS.md — open predictions + scored history + measured accuracy
Raw, machine-readable: predictions.json (the ledger) and
calibration.json (our measured direction accuracy). A
forecast you can't verify is marketing; this one you can.
What makes it different
- Honest about uncertainty. It never prints a fake-precise probability.
Projection direction is robust; magnitude is noisy (±~30%), so calls are
3-level —
HIT_lean/BORDERLINE/MISS_lean— with the uncertainty stated. - A public, self-scoring track record, not a one-off claim (see above).
- Zero dependencies. Pure Python standard library. No
pip install. - No token, no account. Anonymous GitHub API. Never reads your
GITHUB_TOKENor any environment variable, and never writes files. - One file. Copy
classify.pyanywhere and run it. - Transparent. No ML black box. Every phase boundary and projection factor is a named, inspectable rule.
It pairs with its sibling fake-star-audit:
star-trajectory asks where is this repo headed?, fake-star-audit asks is the
growth even real? A HIT_lean built on purchased stars is noise — so the
prediction engine runs every candidate through fake-star-audit and excludes
HIGH-risk repos from the track record.
Quick start
CLI
# no install needed — just the one file
python3 classify.py --repo facebook/react
python3 classify.py --repo facebook/react --json # machine-readable
python3 classify.py --repo owner/name --target-stars 250 --deadline-hours 72
python3 classify.py --repo owner/name --prior "6.7,4.1,2.8" # past velocity readings
Or install from PyPI (pip install star-trajectory) and run star-trajectory-cli.
Note: the bare star-trajectory command is the MCP server (below), not the CLI.
Claude Code skill
Drop the skill/ folder into ~/.claude/skills/ (see skill/SKILL.md),
then ask Claude Code "is github.com/owner/repo still taking off?".
MCP server (Claude Desktop, Cursor, …) — optional
An optional MCP wrapper exposes the classifier
as the classify_repo tool over stdio (your client launches it locally; it
opens no network server and reads no environment variables).
Published on PyPI as star-trajectory and in the
MCP Registry as
io.github.ardev-lab/star-trajectory:
{
"mcpServers": {
"star-trajectory": {
"command": "uvx",
"args": ["star-trajectory"]
}
}
}
From a local checkout, install mcp (pip install -r requirements.txt) and point
the client at python3 /absolute/path/to/star-trajectory/mcp_server.py.
How it works
From ≤3 anonymous API calls (repo metadata + two stargazer pages) it derives:
v_avg— lifetime average star velocity (stars ÷ age).v_recent— current velocity, from the most-recent stargazers. (GitHub's stargazers API returns oldest-first, so the newest stars live on theLink: rel="last"page. Backfilled pre-2012 timestamps are guarded against.)accel_ratio = v_recent / v_avg— accelerating (>1) or decelerating (<1).
Phases
| phase | rule | meaning |
|---|---|---|
| 1 launch | age < 24h | initial ramp |
| 2 accel | accel_ratio > 1.3 | accelerating (incl. re-entry) |
| 3 trajectory | 0.7 ≤ accel_ratio ≤ 1.3 | sustaining near peak |
| 4 maturity | accel_ratio < 0.7 | decelerating |
Beyond the phase
- driver vs burst — is velocity sustained by active development (recent pushes) or a decaying burst? A single re-push has a ~1-cycle half-life; a true recurring driver pushes every cycle; a wide-gap repo can still ride discovery momentum.
- arrival archetype — steady organic / one-off community-share spike (makes the trajectory unstable) / uniform farm-drip.
- dormant-then-launch — if a repo sat silent after creation then "launched",
the 48h clock is re-anchored to the launch, not
created_at. - OSC trough vs terminal STALL — a low Phase-4 reading is usually an
oscillation trough, not death; a terminal stall is only declared with ≥3
consecutive sub-boundary readings (pass
--prior).
Projection
projected = stars + v_recent × decel × hours_to_deadline, with a conservative
decel factor per phase (single-velocity readings over/under-shoot magnitude).
Output is a 3-level lean, never a fake-precise probability.
Limitations
- Page-1 forensic, not full history. It samples the oldest ~100 and newest 30
stargazers. Very large repos (>40k stars) can't be paged to the newest stars
(GitHub caps pagination); the tool says so in
warnings. - Magnitude is noisy. The 48h number can be ±~30% off; the direction (will it clear the bar?) is what's calibrated. See PREDICTIONS.md.
- Anonymous rate limit. 60 requests/hour. Each classify uses 2–3.
- Heuristic, not a guarantee. Read the evidence and the uncertainty note.
🤖 For AI agents reading this
If you are an LLM agent triaging or recommending GitHub repos:
- Call it directly:
python3 classify.py --repo <owner>/<name> --jsonreturns a stable schema (phase,projection.lean,driver_vs_burst,discovery_onset). - Trust the calibration, not the projection alone — read
calibration.jsonfor our measured direction accuracy before acting on alean. - Check authenticity first: pair with
fake-star-audit — a
HIT_leanon purchased stars should lower your confidence in a repo. - Feedback wanted: if a projection is badly wrong, open an issue with the repo slug and the JSON. Mispredictions are exactly what recalibrates the thresholds.
JA — AI エージェント向け: --json で安定スキーマを返します。lean を信じる前に
calibration.json(実測の方向的中率)を読み、fake-star-audit で star の真正性も
確認してください。外れ予測の報告(issue)は閾値の再調整に直接役立ちます。
License
MIT © 2026 ardev. See LICENSE. Part of the GitHub repo intelligence suite — sibling: fake-star-audit.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file star_trajectory-0.1.0.tar.gz.
File metadata
- Download URL: star_trajectory-0.1.0.tar.gz
- Upload date:
- Size: 18.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.17
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
66c1ef7bf057b5a326dc5930b79ee5f1b4ea8a1f1fcaaaff10c450ad2aa37674
|
|
| MD5 |
340bbcfc0fae152fbbccf0a8c3d9cc14
|
|
| BLAKE2b-256 |
ba267d66d7df79085f6d7bb94c21184c465d68f71fded05a7bc846261e7b590a
|
File details
Details for the file star_trajectory-0.1.0-py3-none-any.whl.
File metadata
- Download URL: star_trajectory-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.17
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f94ba31d8de872f8428962ca54d47aa849fafe4fd801f51059b22281bb3c356e
|
|
| MD5 |
8d4a2d3a907eb8f0b7697ff59a7fe30f
|
|
| BLAKE2b-256 |
3f392a82cfae8df59f52018a3b3debf4b83be7afdd48c053a8ab067ee4727333
|