From 19b5832dd09ddf165b214dcf331c6e6df904b551 Mon Sep 17 00:00:00 2001 From: MarSeventh <1193267292@qq.com> Date: Tue, 28 Jul 2026 22:55:12 +0800 Subject: [PATCH] feat: bootstrap star history from GitHub API --- .github/star-history/history.json | 3617 ----------------------- .github/star-history/star_history.py | 257 +- .github/workflows/sync-star-history.yml | 12 +- 3 files changed, 157 insertions(+), 3729 deletions(-) delete mode 100644 .github/star-history/history.json diff --git a/.github/star-history/history.json b/.github/star-history/history.json deleted file mode 100644 index 196fe028..00000000 --- a/.github/star-history/history.json +++ /dev/null @@ -1,3617 +0,0 @@ -{ - "ongoing_interval_days": 7, - "schema_version": 2, - "series": [ - { - "reconstruction": { - "daily": [ - { - "date": "2024-07-20", - "stars": 39 - }, - { - "date": "2024-07-21", - "stars": 59 - }, - { - "date": "2024-07-22", - "stars": 79 - }, - { - "date": "2024-07-23", - "stars": 83 - }, - { - "date": "2024-07-24", - "stars": 88 - }, - { - "date": "2024-07-25", - "stars": 89 - }, - { - "date": "2024-07-26", - "stars": 95 - }, - { - "date": "2024-07-27", - "stars": 98 - }, - { - "date": "2024-07-28", - "stars": 101 - }, - { - "date": "2024-07-29", - "stars": 103 - }, - { - "date": "2024-07-30", - "stars": 108 - }, - { - "date": "2024-07-31", - "stars": 110 - }, - { - "date": "2024-08-01", - "stars": 113 - }, - { - "date": "2024-08-02", - "stars": 127 - }, - { - "date": "2024-08-05", - "stars": 130 - }, - { - "date": "2024-08-06", - "stars": 134 - }, - { - "date": "2024-08-07", - "stars": 138 - }, - { - "date": "2024-08-08", - "stars": 140 - }, - { - "date": "2024-08-10", - "stars": 141 - }, - { - "date": "2024-08-11", - "stars": 142 - }, - { - "date": "2024-08-12", - "stars": 143 - }, - { - "date": "2024-08-13", - "stars": 146 - }, - { - "date": "2024-08-14", - "stars": 149 - }, - { - "date": "2024-08-15", - "stars": 152 - }, - { - "date": "2024-08-17", - "stars": 156 - }, - { - "date": "2024-08-18", - "stars": 158 - }, - { - "date": "2024-08-19", - "stars": 160 - }, - { - "date": "2024-08-20", - "stars": 163 - }, - { - "date": "2024-08-21", - "stars": 167 - }, - { - "date": "2024-08-22", - "stars": 171 - }, - { - "date": "2024-08-23", - "stars": 176 - }, - { - "date": "2024-08-24", - "stars": 181 - }, - { - "date": "2024-08-25", - "stars": 183 - }, - { - "date": "2024-08-26", - "stars": 194 - }, - { - "date": "2024-08-27", - "stars": 196 - }, - { - "date": "2024-08-28", - "stars": 200 - }, - { - "date": "2024-08-29", - "stars": 203 - }, - { - "date": "2024-08-30", - "stars": 206 - }, - { - "date": "2024-08-31", - "stars": 207 - }, - { - "date": "2024-09-01", - "stars": 213 - }, - { - "date": "2024-09-02", - "stars": 217 - }, - { - "date": "2024-09-03", - "stars": 227 - }, - { - "date": "2024-09-04", - "stars": 230 - }, - { - "date": "2024-09-05", - "stars": 235 - }, - { - "date": "2024-09-07", - "stars": 251 - }, - { - "date": "2024-09-08", - "stars": 271 - }, - { - "date": "2024-09-09", - "stars": 402 - }, - { - "date": "2024-09-10", - "stars": 466 - }, - { - "date": "2024-09-11", - "stars": 491 - }, - { - "date": "2024-09-12", - "stars": 504 - }, - { - "date": "2024-09-13", - "stars": 512 - }, - { - "date": "2024-09-14", - "stars": 527 - }, - { - "date": "2024-09-15", - "stars": 531 - }, - { - "date": "2024-09-16", - "stars": 542 - }, - { - "date": "2024-09-17", - "stars": 551 - }, - { - "date": "2024-09-18", - "stars": 559 - }, - { - "date": "2024-09-19", - "stars": 563 - }, - { - "date": "2024-09-20", - "stars": 565 - }, - { - "date": "2024-09-21", - "stars": 570 - }, - { - "date": "2024-09-22", - "stars": 578 - }, - { - "date": "2024-09-23", - "stars": 586 - }, - { - "date": "2024-09-24", - "stars": 590 - }, - { - "date": "2024-09-25", - "stars": 601 - }, - { - "date": "2024-09-26", - "stars": 605 - }, - { - "date": "2024-09-27", - "stars": 608 - }, - { - "date": "2024-09-28", - "stars": 612 - }, - { - "date": "2024-09-29", - "stars": 617 - }, - { - "date": "2024-09-30", - "stars": 619 - }, - { - "date": "2024-10-01", - "stars": 624 - }, - { - "date": "2024-10-02", - "stars": 630 - }, - { - "date": "2024-10-03", - "stars": 638 - }, - { - "date": "2024-10-04", - "stars": 643 - }, - { - "date": "2024-10-05", - "stars": 649 - }, - { - "date": "2024-10-06", - "stars": 658 - }, - { - "date": "2024-10-07", - "stars": 660 - }, - { - "date": "2024-10-08", - "stars": 662 - }, - { - "date": "2024-10-09", - "stars": 665 - }, - { - "date": "2024-10-10", - "stars": 667 - }, - { - "date": "2024-10-11", - "stars": 675 - }, - { - "date": "2024-10-12", - "stars": 681 - }, - { - "date": "2024-10-13", - "stars": 685 - }, - { - "date": "2024-10-14", - "stars": 691 - }, - { - "date": "2024-10-15", - "stars": 695 - }, - { - "date": "2024-10-16", - "stars": 700 - }, - { - "date": "2024-10-17", - "stars": 707 - }, - { - "date": "2024-10-18", - "stars": 713 - }, - { - "date": "2024-10-19", - "stars": 716 - }, - { - "date": "2024-10-20", - "stars": 723 - }, - { - "date": "2024-10-21", - "stars": 754 - }, - { - "date": "2024-10-22", - "stars": 763 - }, - { - "date": "2024-10-23", - "stars": 769 - }, - { - "date": "2024-10-24", - "stars": 773 - }, - { - "date": "2024-10-25", - "stars": 783 - }, - { - "date": "2024-10-26", - "stars": 786 - }, - { - "date": "2024-10-27", - "stars": 790 - }, - { - "date": "2024-10-28", - "stars": 796 - }, - { - "date": "2024-10-29", - "stars": 799 - }, - { - "date": "2024-10-30", - "stars": 804 - }, - { - "date": "2024-10-31", - "stars": 810 - }, - { - "date": "2024-11-01", - "stars": 812 - }, - { - "date": "2024-11-02", - "stars": 814 - }, - { - "date": "2024-11-03", - "stars": 816 - }, - { - "date": "2024-11-04", - "stars": 822 - }, - { - "date": "2024-11-05", - "stars": 830 - }, - { - "date": "2024-11-06", - "stars": 857 - }, - { - "date": "2024-11-07", - "stars": 866 - }, - { - "date": "2024-11-08", - "stars": 873 - }, - { - "date": "2024-11-09", - "stars": 874 - }, - { - "date": "2024-11-10", - "stars": 879 - }, - { - "date": "2024-11-11", - "stars": 882 - }, - { - "date": "2024-11-12", - "stars": 885 - }, - { - "date": "2024-11-13", - "stars": 889 - }, - { - "date": "2024-11-14", - "stars": 893 - }, - { - "date": "2024-11-15", - "stars": 900 - }, - { - "date": "2024-11-16", - "stars": 903 - }, - { - "date": "2024-11-17", - "stars": 935 - }, - { - "date": "2024-11-18", - "stars": 951 - }, - { - "date": "2024-11-19", - "stars": 961 - }, - { - "date": "2024-11-20", - "stars": 962 - }, - { - "date": "2024-11-21", - "stars": 966 - }, - { - "date": "2024-11-22", - "stars": 969 - }, - { - "date": "2024-11-23", - "stars": 972 - }, - { - "date": "2024-11-24", - "stars": 976 - }, - { - "date": "2024-11-25", - "stars": 982 - }, - { - "date": "2024-11-26", - "stars": 986 - }, - { - "date": "2024-11-27", - "stars": 989 - }, - { - "date": "2024-11-28", - "stars": 999 - }, - { - "date": "2024-11-29", - "stars": 1001 - }, - { - "date": "2024-11-30", - "stars": 1006 - }, - { - "date": "2024-12-01", - "stars": 1010 - }, - { - "date": "2024-12-02", - "stars": 1011 - }, - { - "date": "2024-12-03", - "stars": 1016 - }, - { - "date": "2024-12-04", - "stars": 1019 - }, - { - "date": "2024-12-05", - "stars": 1022 - }, - { - "date": "2024-12-06", - "stars": 1027 - }, - { - "date": "2024-12-07", - "stars": 1029 - }, - { - "date": "2024-12-08", - "stars": 1040 - }, - { - "date": "2024-12-09", - "stars": 1067 - }, - { - "date": "2024-12-10", - "stars": 1083 - }, - { - "date": "2024-12-11", - "stars": 1089 - }, - { - "date": "2024-12-12", - "stars": 1105 - }, - { - "date": "2024-12-13", - "stars": 1120 - }, - { - "date": "2024-12-14", - "stars": 1131 - }, - { - "date": "2024-12-15", - "stars": 1136 - }, - { - "date": "2024-12-16", - "stars": 1149 - }, - { - "date": "2024-12-17", - "stars": 1155 - }, - { - "date": "2024-12-18", - "stars": 1158 - }, - { - "date": "2024-12-19", - "stars": 1168 - }, - { - "date": "2024-12-20", - "stars": 1182 - }, - { - "date": "2024-12-21", - "stars": 1188 - }, - { - "date": "2024-12-22", - "stars": 1194 - }, - { - "date": "2024-12-23", - "stars": 1199 - }, - { - "date": "2024-12-25", - "stars": 1210 - }, - { - "date": "2024-12-26", - "stars": 1217 - }, - { - "date": "2024-12-27", - "stars": 1222 - }, - { - "date": "2024-12-28", - "stars": 1228 - }, - { - "date": "2024-12-29", - "stars": 1237 - }, - { - "date": "2024-12-30", - "stars": 1244 - }, - { - "date": "2024-12-31", - "stars": 1247 - }, - { - "date": "2025-01-01", - "stars": 1251 - }, - { - "date": "2025-01-02", - "stars": 1258 - }, - { - "date": "2025-01-03", - "stars": 1265 - }, - { - "date": "2025-01-04", - "stars": 1268 - }, - { - "date": "2025-01-05", - "stars": 1271 - }, - { - "date": "2025-01-06", - "stars": 1285 - }, - { - "date": "2025-01-07", - "stars": 1293 - }, - { - "date": "2025-01-08", - "stars": 1299 - }, - { - "date": "2025-01-09", - "stars": 1304 - }, - { - "date": "2025-01-10", - "stars": 1308 - }, - { - "date": "2025-01-11", - "stars": 1309 - }, - { - "date": "2025-01-12", - "stars": 1314 - }, - { - "date": "2025-01-13", - "stars": 1322 - }, - { - "date": "2025-01-14", - "stars": 1323 - }, - { - "date": "2025-01-15", - "stars": 1325 - }, - { - "date": "2025-01-16", - "stars": 1326 - }, - { - "date": "2025-01-17", - "stars": 1332 - }, - { - "date": "2025-01-18", - "stars": 1337 - }, - { - "date": "2025-01-19", - "stars": 1341 - }, - { - "date": "2025-01-20", - "stars": 1342 - }, - { - "date": "2025-01-21", - "stars": 1344 - }, - { - "date": "2025-01-22", - "stars": 1347 - }, - { - "date": "2025-01-23", - "stars": 1353 - }, - { - "date": "2025-01-24", - "stars": 1355 - }, - { - "date": "2025-01-25", - "stars": 1357 - }, - { - "date": "2025-01-26", - "stars": 1361 - }, - { - "date": "2025-01-27", - "stars": 1363 - }, - { - "date": "2025-01-28", - "stars": 1366 - }, - { - "date": "2025-01-29", - "stars": 1370 - }, - { - "date": "2025-01-30", - "stars": 1373 - }, - { - "date": "2025-01-31", - "stars": 1374 - }, - { - "date": "2025-02-01", - "stars": 1375 - }, - { - "date": "2025-02-02", - "stars": 1381 - }, - { - "date": "2025-02-03", - "stars": 1394 - }, - { - "date": "2025-02-04", - "stars": 1407 - }, - { - "date": "2025-02-05", - "stars": 1408 - }, - { - "date": "2025-02-06", - "stars": 1417 - }, - { - "date": "2025-02-07", - "stars": 1424 - }, - { - "date": "2025-02-08", - "stars": 1430 - }, - { - "date": "2025-02-09", - "stars": 1431 - }, - { - "date": "2025-02-10", - "stars": 1434 - }, - { - "date": "2025-02-11", - "stars": 1441 - }, - { - "date": "2025-02-12", - "stars": 1442 - }, - { - "date": "2025-02-13", - "stars": 1445 - }, - { - "date": "2025-02-14", - "stars": 1446 - }, - { - "date": "2025-02-15", - "stars": 1451 - }, - { - "date": "2025-02-16", - "stars": 1452 - }, - { - "date": "2025-02-17", - "stars": 1457 - }, - { - "date": "2025-02-18", - "stars": 1460 - }, - { - "date": "2025-02-19", - "stars": 1462 - }, - { - "date": "2025-02-20", - "stars": 1463 - }, - { - "date": "2025-02-21", - "stars": 1464 - }, - { - "date": "2025-02-22", - "stars": 1468 - }, - { - "date": "2025-02-23", - "stars": 1470 - }, - { - "date": "2025-02-24", - "stars": 1474 - }, - { - "date": "2025-02-25", - "stars": 1479 - }, - { - "date": "2025-02-26", - "stars": 1482 - }, - { - "date": "2025-02-27", - "stars": 1484 - }, - { - "date": "2025-02-28", - "stars": 1490 - }, - { - "date": "2025-03-01", - "stars": 1493 - }, - { - "date": "2025-03-02", - "stars": 1496 - }, - { - "date": "2025-03-03", - "stars": 1503 - }, - { - "date": "2025-03-04", - "stars": 1506 - }, - { - "date": "2025-03-05", - "stars": 1512 - }, - { - "date": "2025-03-06", - "stars": 1517 - }, - { - "date": "2025-03-07", - "stars": 1521 - }, - { - "date": "2025-03-08", - "stars": 1525 - }, - { - "date": "2025-03-09", - "stars": 1531 - }, - { - "date": "2025-03-10", - "stars": 1535 - }, - { - "date": "2025-03-11", - "stars": 1544 - }, - { - "date": "2025-03-12", - "stars": 1552 - }, - { - "date": "2025-03-13", - "stars": 1555 - }, - { - "date": "2025-03-14", - "stars": 1570 - }, - { - "date": "2025-03-15", - "stars": 1574 - }, - { - "date": "2025-03-16", - "stars": 1576 - }, - { - "date": "2025-03-17", - "stars": 1581 - }, - { - "date": "2025-03-18", - "stars": 1589 - }, - { - "date": "2025-03-19", - "stars": 1593 - }, - { - "date": "2025-03-20", - "stars": 1596 - }, - { - "date": "2025-03-21", - "stars": 1601 - }, - { - "date": "2025-03-22", - "stars": 1607 - }, - { - "date": "2025-03-23", - "stars": 1609 - }, - { - "date": "2025-03-24", - "stars": 1611 - }, - { - "date": "2025-03-25", - "stars": 1616 - }, - { - "date": "2025-03-26", - "stars": 1625 - }, - { - "date": "2025-03-27", - "stars": 1630 - }, - { - "date": "2025-03-28", - "stars": 1632 - }, - { - "date": "2025-03-29", - "stars": 1634 - }, - { - "date": "2025-03-30", - "stars": 1636 - }, - { - "date": "2025-03-31", - "stars": 1638 - }, - { - "date": "2025-04-01", - "stars": 1639 - }, - { - "date": "2025-04-02", - "stars": 1671 - }, - { - "date": "2025-04-03", - "stars": 1693 - }, - { - "date": "2025-04-04", - "stars": 1708 - }, - { - "date": "2025-04-05", - "stars": 1712 - }, - { - "date": "2025-04-06", - "stars": 1723 - }, - { - "date": "2025-04-07", - "stars": 1735 - }, - { - "date": "2025-04-08", - "stars": 1745 - }, - { - "date": "2025-04-09", - "stars": 1755 - }, - { - "date": "2025-04-10", - "stars": 1762 - }, - { - "date": "2025-04-11", - "stars": 1767 - }, - { - "date": "2025-04-12", - "stars": 1784 - }, - { - "date": "2025-04-13", - "stars": 1792 - }, - { - "date": "2025-04-14", - "stars": 1797 - }, - { - "date": "2025-04-15", - "stars": 1799 - }, - { - "date": "2025-04-16", - "stars": 1804 - }, - { - "date": "2025-04-17", - "stars": 1807 - }, - { - "date": "2025-04-18", - "stars": 1812 - }, - { - "date": "2025-04-19", - "stars": 1816 - }, - { - "date": "2025-04-20", - "stars": 1820 - }, - { - "date": "2025-04-21", - "stars": 1823 - }, - { - "date": "2025-04-22", - "stars": 1831 - }, - { - "date": "2025-04-23", - "stars": 1839 - }, - { - "date": "2025-04-24", - "stars": 1843 - }, - { - "date": "2025-04-25", - "stars": 1848 - }, - { - "date": "2025-04-26", - "stars": 1851 - }, - { - "date": "2025-04-27", - "stars": 1860 - }, - { - "date": "2025-04-28", - "stars": 1862 - }, - { - "date": "2025-04-29", - "stars": 1864 - }, - { - "date": "2025-04-30", - "stars": 1872 - }, - { - "date": "2025-05-01", - "stars": 1879 - }, - { - "date": "2025-05-02", - "stars": 1889 - }, - { - "date": "2025-05-03", - "stars": 1894 - }, - { - "date": "2025-05-04", - "stars": 1899 - }, - { - "date": "2025-05-05", - "stars": 1903 - }, - { - "date": "2025-05-06", - "stars": 1905 - }, - { - "date": "2025-05-07", - "stars": 1910 - }, - { - "date": "2025-05-08", - "stars": 1914 - }, - { - "date": "2025-05-09", - "stars": 1922 - }, - { - "date": "2025-05-10", - "stars": 1930 - }, - { - "date": "2025-05-11", - "stars": 1938 - }, - { - "date": "2025-05-12", - "stars": 1946 - }, - { - "date": "2025-05-13", - "stars": 1953 - }, - { - "date": "2025-05-14", - "stars": 1959 - }, - { - "date": "2025-05-15", - "stars": 1965 - }, - { - "date": "2025-05-16", - "stars": 1971 - }, - { - "date": "2025-05-17", - "stars": 1976 - }, - { - "date": "2025-05-18", - "stars": 1980 - }, - { - "date": "2025-05-19", - "stars": 1985 - }, - { - "date": "2025-05-20", - "stars": 1995 - }, - { - "date": "2025-05-21", - "stars": 2007 - }, - { - "date": "2025-05-22", - "stars": 2017 - }, - { - "date": "2025-05-23", - "stars": 2021 - }, - { - "date": "2025-05-24", - "stars": 2026 - }, - { - "date": "2025-05-25", - "stars": 2027 - }, - { - "date": "2025-05-26", - "stars": 2035 - }, - { - "date": "2025-05-27", - "stars": 2039 - }, - { - "date": "2025-05-28", - "stars": 2046 - }, - { - "date": "2025-05-29", - "stars": 2050 - }, - { - "date": "2025-05-30", - "stars": 2055 - }, - { - "date": "2025-05-31", - "stars": 2057 - }, - { - "date": "2025-06-01", - "stars": 2061 - }, - { - "date": "2025-06-02", - "stars": 2064 - }, - { - "date": "2025-06-03", - "stars": 2069 - }, - { - "date": "2025-06-04", - "stars": 2072 - }, - { - "date": "2025-06-05", - "stars": 2076 - }, - { - "date": "2025-06-06", - "stars": 2079 - }, - { - "date": "2025-06-07", - "stars": 2084 - }, - { - "date": "2025-06-08", - "stars": 2085 - }, - { - "date": "2025-06-09", - "stars": 2125 - }, - { - "date": "2025-06-10", - "stars": 2133 - }, - { - "date": "2025-06-11", - "stars": 2141 - }, - { - "date": "2025-06-12", - "stars": 2143 - }, - { - "date": "2025-06-13", - "stars": 2147 - }, - { - "date": "2025-06-14", - "stars": 2149 - }, - { - "date": "2025-06-15", - "stars": 2167 - }, - { - "date": "2025-06-16", - "stars": 2177 - }, - { - "date": "2025-06-17", - "stars": 2181 - }, - { - "date": "2025-06-18", - "stars": 2186 - }, - { - "date": "2025-06-19", - "stars": 2198 - }, - { - "date": "2025-06-20", - "stars": 2204 - }, - { - "date": "2025-06-21", - "stars": 2209 - }, - { - "date": "2025-06-22", - "stars": 2212 - }, - { - "date": "2025-06-23", - "stars": 2213 - }, - { - "date": "2025-06-24", - "stars": 2217 - }, - { - "date": "2025-06-25", - "stars": 2222 - }, - { - "date": "2025-06-26", - "stars": 2226 - }, - { - "date": "2025-06-27", - "stars": 2232 - }, - { - "date": "2025-06-28", - "stars": 2238 - }, - { - "date": "2025-06-29", - "stars": 2245 - }, - { - "date": "2025-06-30", - "stars": 2249 - }, - { - "date": "2025-07-01", - "stars": 2255 - }, - { - "date": "2025-07-02", - "stars": 2258 - }, - { - "date": "2025-07-03", - "stars": 2260 - }, - { - "date": "2025-07-04", - "stars": 2268 - }, - { - "date": "2025-07-05", - "stars": 2277 - }, - { - "date": "2025-07-06", - "stars": 2285 - }, - { - "date": "2025-07-07", - "stars": 2302 - }, - { - "date": "2025-07-08", - "stars": 2310 - }, - { - "date": "2025-07-09", - "stars": 2320 - }, - { - "date": "2025-07-10", - "stars": 2330 - }, - { - "date": "2025-07-11", - "stars": 2341 - }, - { - "date": "2025-07-12", - "stars": 2350 - }, - { - "date": "2025-07-13", - "stars": 2355 - }, - { - "date": "2025-07-14", - "stars": 2360 - }, - { - "date": "2025-07-15", - "stars": 2365 - }, - { - "date": "2025-07-16", - "stars": 2373 - }, - { - "date": "2025-07-17", - "stars": 2413 - }, - { - "date": "2025-07-18", - "stars": 2443 - }, - { - "date": "2025-07-19", - "stars": 2461 - }, - { - "date": "2025-07-20", - "stars": 2474 - }, - { - "date": "2025-07-21", - "stars": 2479 - }, - { - "date": "2025-07-22", - "stars": 2485 - }, - { - "date": "2025-07-23", - "stars": 2492 - }, - { - "date": "2025-07-24", - "stars": 2505 - }, - { - "date": "2025-07-25", - "stars": 2509 - }, - { - "date": "2025-07-26", - "stars": 2519 - }, - { - "date": "2025-07-27", - "stars": 2524 - }, - { - "date": "2025-07-28", - "stars": 2529 - }, - { - "date": "2025-07-29", - "stars": 2536 - }, - { - "date": "2025-07-30", - "stars": 2543 - }, - { - "date": "2025-07-31", - "stars": 2554 - }, - { - "date": "2025-08-01", - "stars": 2565 - }, - { - "date": "2025-08-02", - "stars": 2572 - }, - { - "date": "2025-08-03", - "stars": 2582 - }, - { - "date": "2025-08-04", - "stars": 2592 - }, - { - "date": "2025-08-05", - "stars": 2595 - }, - { - "date": "2025-08-06", - "stars": 2602 - }, - { - "date": "2025-08-07", - "stars": 2611 - }, - { - "date": "2025-08-08", - "stars": 2613 - }, - { - "date": "2025-08-09", - "stars": 2618 - }, - { - "date": "2025-08-10", - "stars": 2626 - }, - { - "date": "2025-08-11", - "stars": 2641 - }, - { - "date": "2025-08-12", - "stars": 2661 - }, - { - "date": "2025-08-13", - "stars": 2669 - }, - { - "date": "2025-08-14", - "stars": 2681 - }, - { - "date": "2025-08-15", - "stars": 2685 - }, - { - "date": "2025-08-16", - "stars": 2689 - }, - { - "date": "2025-08-17", - "stars": 2698 - }, - { - "date": "2025-08-18", - "stars": 2706 - }, - { - "date": "2025-08-19", - "stars": 2711 - }, - { - "date": "2025-08-20", - "stars": 2718 - }, - { - "date": "2025-08-21", - "stars": 2723 - }, - { - "date": "2025-08-22", - "stars": 2729 - }, - { - "date": "2025-08-23", - "stars": 2736 - }, - { - "date": "2025-08-24", - "stars": 2743 - }, - { - "date": "2025-08-25", - "stars": 2756 - }, - { - "date": "2025-08-26", - "stars": 2774 - }, - { - "date": "2025-08-27", - "stars": 2796 - }, - { - "date": "2025-08-28", - "stars": 2824 - }, - { - "date": "2025-08-29", - "stars": 2830 - }, - { - "date": "2025-08-30", - "stars": 2834 - }, - { - "date": "2025-08-31", - "stars": 2843 - }, - { - "date": "2025-09-01", - "stars": 2855 - }, - { - "date": "2025-09-02", - "stars": 2863 - }, - { - "date": "2025-09-03", - "stars": 2871 - }, - { - "date": "2025-09-04", - "stars": 2877 - }, - { - "date": "2025-09-05", - "stars": 2881 - }, - { - "date": "2025-09-06", - "stars": 2887 - }, - { - "date": "2025-09-07", - "stars": 2890 - }, - { - "date": "2025-09-08", - "stars": 2897 - }, - { - "date": "2025-09-09", - "stars": 2905 - }, - { - "date": "2025-09-10", - "stars": 2907 - }, - { - "date": "2025-09-11", - "stars": 2912 - }, - { - "date": "2025-09-12", - "stars": 2916 - }, - { - "date": "2025-09-13", - "stars": 2920 - }, - { - "date": "2025-09-14", - "stars": 2927 - }, - { - "date": "2025-09-15", - "stars": 2930 - }, - { - "date": "2025-09-16", - "stars": 2949 - }, - { - "date": "2025-09-17", - "stars": 2960 - }, - { - "date": "2025-09-18", - "stars": 2969 - }, - { - "date": "2025-09-19", - "stars": 2978 - }, - { - "date": "2025-09-20", - "stars": 2980 - }, - { - "date": "2025-09-21", - "stars": 2985 - }, - { - "date": "2025-09-22", - "stars": 2991 - }, - { - "date": "2025-09-23", - "stars": 2992 - }, - { - "date": "2025-09-24", - "stars": 3000 - }, - { - "date": "2025-09-25", - "stars": 3005 - }, - { - "date": "2025-09-26", - "stars": 3010 - }, - { - "date": "2025-09-27", - "stars": 3014 - }, - { - "date": "2025-09-28", - "stars": 3020 - }, - { - "date": "2025-09-29", - "stars": 3031 - }, - { - "date": "2025-09-30", - "stars": 3035 - }, - { - "date": "2025-10-01", - "stars": 3038 - }, - { - "date": "2025-10-02", - "stars": 3042 - }, - { - "date": "2025-10-03", - "stars": 3045 - }, - { - "date": "2025-10-04", - "stars": 3049 - }, - { - "date": "2025-10-05", - "stars": 3061 - }, - { - "date": "2025-10-06", - "stars": 3066 - }, - { - "date": "2025-10-07", - "stars": 3069 - }, - { - "date": "2025-10-08", - "stars": 3071 - }, - { - "date": "2025-10-09", - "stars": 3076 - }, - { - "date": "2025-10-10", - "stars": 3084 - }, - { - "date": "2025-10-11", - "stars": 3087 - }, - { - "date": "2025-10-12", - "stars": 3091 - }, - { - "date": "2025-10-13", - "stars": 3093 - }, - { - "date": "2025-10-14", - "stars": 3106 - }, - { - "date": "2025-10-15", - "stars": 3110 - }, - { - "date": "2025-10-16", - "stars": 3113 - }, - { - "date": "2025-10-17", - "stars": 3120 - }, - { - "date": "2025-10-18", - "stars": 3126 - }, - { - "date": "2025-10-19", - "stars": 3137 - }, - { - "date": "2025-10-20", - "stars": 3140 - }, - { - "date": "2025-10-21", - "stars": 3145 - }, - { - "date": "2025-10-22", - "stars": 3147 - }, - { - "date": "2025-10-23", - "stars": 3152 - }, - { - "date": "2025-10-24", - "stars": 3159 - }, - { - "date": "2025-10-25", - "stars": 3165 - }, - { - "date": "2025-10-26", - "stars": 3168 - }, - { - "date": "2025-10-27", - "stars": 3169 - }, - { - "date": "2025-10-28", - "stars": 3178 - }, - { - "date": "2025-10-29", - "stars": 3181 - }, - { - "date": "2025-10-30", - "stars": 3186 - }, - { - "date": "2025-10-31", - "stars": 3194 - }, - { - "date": "2025-11-01", - "stars": 3202 - }, - { - "date": "2025-11-02", - "stars": 3208 - }, - { - "date": "2025-11-03", - "stars": 3214 - }, - { - "date": "2025-11-04", - "stars": 3222 - }, - { - "date": "2025-11-05", - "stars": 3226 - }, - { - "date": "2025-11-06", - "stars": 3236 - }, - { - "date": "2025-11-07", - "stars": 3241 - }, - { - "date": "2025-11-08", - "stars": 3244 - }, - { - "date": "2025-11-09", - "stars": 3247 - }, - { - "date": "2025-11-10", - "stars": 3260 - }, - { - "date": "2025-11-11", - "stars": 3266 - }, - { - "date": "2025-11-12", - "stars": 3269 - }, - { - "date": "2025-11-13", - "stars": 3285 - }, - { - "date": "2025-11-14", - "stars": 3301 - }, - { - "date": "2025-11-15", - "stars": 3309 - }, - { - "date": "2025-11-16", - "stars": 3318 - }, - { - "date": "2025-11-17", - "stars": 3326 - }, - { - "date": "2025-11-18", - "stars": 3333 - }, - { - "date": "2025-11-19", - "stars": 3340 - }, - { - "date": "2025-11-20", - "stars": 3349 - }, - { - "date": "2025-11-21", - "stars": 3356 - }, - { - "date": "2025-11-22", - "stars": 3361 - }, - { - "date": "2025-11-23", - "stars": 3368 - }, - { - "date": "2025-11-24", - "stars": 3372 - }, - { - "date": "2025-11-25", - "stars": 3381 - }, - { - "date": "2025-11-26", - "stars": 3387 - }, - { - "date": "2025-11-27", - "stars": 3396 - }, - { - "date": "2025-11-28", - "stars": 3407 - }, - { - "date": "2025-11-29", - "stars": 3415 - }, - { - "date": "2025-11-30", - "stars": 3421 - }, - { - "date": "2025-12-01", - "stars": 3430 - }, - { - "date": "2025-12-02", - "stars": 3436 - }, - { - "date": "2025-12-03", - "stars": 3447 - }, - { - "date": "2025-12-04", - "stars": 3459 - }, - { - "date": "2025-12-05", - "stars": 3476 - }, - { - "date": "2025-12-06", - "stars": 3484 - }, - { - "date": "2025-12-07", - "stars": 3489 - }, - { - "date": "2025-12-08", - "stars": 3498 - }, - { - "date": "2025-12-09", - "stars": 3503 - }, - { - "date": "2025-12-10", - "stars": 3516 - }, - { - "date": "2025-12-11", - "stars": 3529 - }, - { - "date": "2025-12-12", - "stars": 3533 - }, - { - "date": "2025-12-13", - "stars": 3541 - }, - { - "date": "2025-12-14", - "stars": 3547 - }, - { - "date": "2025-12-15", - "stars": 3559 - }, - { - "date": "2025-12-16", - "stars": 3566 - }, - { - "date": "2025-12-17", - "stars": 3577 - }, - { - "date": "2025-12-18", - "stars": 3585 - }, - { - "date": "2025-12-19", - "stars": 3590 - }, - { - "date": "2025-12-20", - "stars": 3603 - }, - { - "date": "2025-12-21", - "stars": 3608 - }, - { - "date": "2025-12-22", - "stars": 3611 - }, - { - "date": "2025-12-23", - "stars": 3621 - }, - { - "date": "2025-12-24", - "stars": 3623 - }, - { - "date": "2025-12-25", - "stars": 3636 - }, - { - "date": "2025-12-26", - "stars": 3642 - }, - { - "date": "2025-12-27", - "stars": 3646 - }, - { - "date": "2025-12-28", - "stars": 3655 - }, - { - "date": "2025-12-29", - "stars": 3664 - }, - { - "date": "2025-12-30", - "stars": 3673 - }, - { - "date": "2025-12-31", - "stars": 3681 - }, - { - "date": "2026-01-01", - "stars": 3708 - }, - { - "date": "2026-01-02", - "stars": 3718 - }, - { - "date": "2026-01-03", - "stars": 3729 - }, - { - "date": "2026-01-04", - "stars": 3739 - }, - { - "date": "2026-01-05", - "stars": 3748 - }, - { - "date": "2026-01-06", - "stars": 3755 - }, - { - "date": "2026-01-07", - "stars": 3774 - }, - { - "date": "2026-01-08", - "stars": 3783 - }, - { - "date": "2026-01-09", - "stars": 3796 - }, - { - "date": "2026-01-10", - "stars": 3810 - }, - { - "date": "2026-01-11", - "stars": 3824 - }, - { - "date": "2026-01-12", - "stars": 3843 - }, - { - "date": "2026-01-13", - "stars": 3852 - }, - { - "date": "2026-01-14", - "stars": 3862 - }, - { - "date": "2026-01-15", - "stars": 3873 - }, - { - "date": "2026-01-16", - "stars": 3892 - }, - { - "date": "2026-01-17", - "stars": 3906 - }, - { - "date": "2026-01-18", - "stars": 3911 - }, - { - "date": "2026-01-19", - "stars": 3923 - }, - { - "date": "2026-01-20", - "stars": 3930 - }, - { - "date": "2026-01-21", - "stars": 3937 - }, - { - "date": "2026-01-22", - "stars": 3939 - }, - { - "date": "2026-01-23", - "stars": 3949 - }, - { - "date": "2026-01-24", - "stars": 3954 - }, - { - "date": "2026-01-25", - "stars": 3964 - }, - { - "date": "2026-01-26", - "stars": 3985 - }, - { - "date": "2026-01-27", - "stars": 3996 - }, - { - "date": "2026-01-28", - "stars": 4006 - }, - { - "date": "2026-01-29", - "stars": 4024 - }, - { - "date": "2026-01-30", - "stars": 4033 - }, - { - "date": "2026-01-31", - "stars": 4045 - }, - { - "date": "2026-02-01", - "stars": 4055 - }, - { - "date": "2026-02-02", - "stars": 4068 - }, - { - "date": "2026-02-03", - "stars": 4086 - }, - { - "date": "2026-02-04", - "stars": 4095 - }, - { - "date": "2026-02-05", - "stars": 4110 - }, - { - "date": "2026-02-06", - "stars": 4131 - }, - { - "date": "2026-02-07", - "stars": 4144 - }, - { - "date": "2026-02-08", - "stars": 4163 - }, - { - "date": "2026-02-09", - "stars": 4172 - }, - { - "date": "2026-02-10", - "stars": 4189 - }, - { - "date": "2026-02-11", - "stars": 4205 - }, - { - "date": "2026-02-12", - "stars": 4227 - }, - { - "date": "2026-02-13", - "stars": 4237 - }, - { - "date": "2026-02-14", - "stars": 4248 - }, - { - "date": "2026-02-15", - "stars": 4268 - }, - { - "date": "2026-02-16", - "stars": 4278 - }, - { - "date": "2026-02-17", - "stars": 4284 - }, - { - "date": "2026-02-18", - "stars": 4286 - }, - { - "date": "2026-02-19", - "stars": 4295 - }, - { - "date": "2026-02-20", - "stars": 4301 - }, - { - "date": "2026-02-21", - "stars": 4306 - }, - { - "date": "2026-02-22", - "stars": 4312 - }, - { - "date": "2026-02-23", - "stars": 4326 - }, - { - "date": "2026-02-24", - "stars": 4334 - }, - { - "date": "2026-02-25", - "stars": 4348 - }, - { - "date": "2026-02-26", - "stars": 4357 - }, - { - "date": "2026-02-27", - "stars": 4371 - }, - { - "date": "2026-02-28", - "stars": 4385 - }, - { - "date": "2026-03-01", - "stars": 4391 - }, - { - "date": "2026-03-02", - "stars": 4399 - }, - { - "date": "2026-03-03", - "stars": 4405 - }, - { - "date": "2026-03-04", - "stars": 4413 - }, - { - "date": "2026-03-05", - "stars": 4426 - }, - { - "date": "2026-03-06", - "stars": 4435 - }, - { - "date": "2026-03-07", - "stars": 4447 - }, - { - "date": "2026-03-08", - "stars": 4451 - }, - { - "date": "2026-03-09", - "stars": 4466 - }, - { - "date": "2026-03-10", - "stars": 4477 - }, - { - "date": "2026-03-11", - "stars": 4485 - }, - { - "date": "2026-03-12", - "stars": 4490 - }, - { - "date": "2026-03-13", - "stars": 4494 - }, - { - "date": "2026-03-14", - "stars": 4496 - }, - { - "date": "2026-03-15", - "stars": 4502 - }, - { - "date": "2026-03-16", - "stars": 4508 - }, - { - "date": "2026-03-17", - "stars": 4517 - }, - { - "date": "2026-03-18", - "stars": 4530 - }, - { - "date": "2026-03-19", - "stars": 4539 - }, - { - "date": "2026-03-20", - "stars": 4551 - }, - { - "date": "2026-03-21", - "stars": 4557 - }, - { - "date": "2026-03-22", - "stars": 4568 - }, - { - "date": "2026-03-23", - "stars": 4577 - }, - { - "date": "2026-03-24", - "stars": 4586 - }, - { - "date": "2026-03-25", - "stars": 4600 - }, - { - "date": "2026-03-26", - "stars": 4611 - }, - { - "date": "2026-03-27", - "stars": 4622 - }, - { - "date": "2026-03-28", - "stars": 4626 - }, - { - "date": "2026-03-29", - "stars": 4633 - }, - { - "date": "2026-03-30", - "stars": 4640 - }, - { - "date": "2026-03-31", - "stars": 4646 - }, - { - "date": "2026-04-01", - "stars": 4650 - }, - { - "date": "2026-04-02", - "stars": 4655 - }, - { - "date": "2026-04-03", - "stars": 4670 - }, - { - "date": "2026-04-04", - "stars": 4678 - }, - { - "date": "2026-04-05", - "stars": 4685 - }, - { - "date": "2026-04-06", - "stars": 4690 - }, - { - "date": "2026-04-07", - "stars": 4697 - }, - { - "date": "2026-04-08", - "stars": 4705 - }, - { - "date": "2026-04-09", - "stars": 4711 - }, - { - "date": "2026-04-10", - "stars": 4718 - }, - { - "date": "2026-04-11", - "stars": 4731 - }, - { - "date": "2026-04-12", - "stars": 4741 - }, - { - "date": "2026-04-13", - "stars": 4749 - }, - { - "date": "2026-04-14", - "stars": 4757 - }, - { - "date": "2026-04-15", - "stars": 4764 - }, - { - "date": "2026-04-16", - "stars": 4769 - }, - { - "date": "2026-04-17", - "stars": 4772 - }, - { - "date": "2026-04-18", - "stars": 4782 - }, - { - "date": "2026-04-19", - "stars": 4785 - }, - { - "date": "2026-04-20", - "stars": 4794 - }, - { - "date": "2026-04-21", - "stars": 4804 - }, - { - "date": "2026-04-22", - "stars": 4808 - }, - { - "date": "2026-04-23", - "stars": 4817 - }, - { - "date": "2026-04-24", - "stars": 4827 - }, - { - "date": "2026-04-25", - "stars": 4837 - }, - { - "date": "2026-04-26", - "stars": 4849 - }, - { - "date": "2026-04-27", - "stars": 4859 - }, - { - "date": "2026-04-28", - "stars": 4861 - }, - { - "date": "2026-04-29", - "stars": 4881 - }, - { - "date": "2026-04-30", - "stars": 4889 - }, - { - "date": "2026-05-01", - "stars": 4897 - }, - { - "date": "2026-05-02", - "stars": 4907 - }, - { - "date": "2026-05-03", - "stars": 4917 - }, - { - "date": "2026-05-04", - "stars": 4932 - }, - { - "date": "2026-05-05", - "stars": 4944 - }, - { - "date": "2026-05-06", - "stars": 4954 - }, - { - "date": "2026-05-07", - "stars": 4963 - }, - { - "date": "2026-05-08", - "stars": 4973 - }, - { - "date": "2026-05-09", - "stars": 4988 - }, - { - "date": "2026-05-10", - "stars": 4997 - }, - { - "date": "2026-05-11", - "stars": 5016 - }, - { - "date": "2026-05-12", - "stars": 5024 - }, - { - "date": "2026-05-13", - "stars": 5030 - }, - { - "date": "2026-05-14", - "stars": 5035 - }, - { - "date": "2026-05-15", - "stars": 5040 - }, - { - "date": "2026-05-16", - "stars": 5045 - }, - { - "date": "2026-05-17", - "stars": 5050 - }, - { - "date": "2026-05-18", - "stars": 5062 - }, - { - "date": "2026-05-19", - "stars": 5066 - }, - { - "date": "2026-05-20", - "stars": 5072 - }, - { - "date": "2026-05-21", - "stars": 5079 - }, - { - "date": "2026-05-22", - "stars": 5089 - }, - { - "date": "2026-05-23", - "stars": 5100 - }, - { - "date": "2026-05-24", - "stars": 5107 - }, - { - "date": "2026-05-25", - "stars": 5119 - }, - { - "date": "2026-05-26", - "stars": 5127 - }, - { - "date": "2026-05-27", - "stars": 5136 - }, - { - "date": "2026-05-28", - "stars": 5147 - }, - { - "date": "2026-05-29", - "stars": 5155 - }, - { - "date": "2026-05-30", - "stars": 5164 - }, - { - "date": "2026-05-31", - "stars": 5175 - }, - { - "date": "2026-06-01", - "stars": 5185 - }, - { - "date": "2026-06-02", - "stars": 5194 - }, - { - "date": "2026-06-03", - "stars": 5199 - }, - { - "date": "2026-06-04", - "stars": 5210 - }, - { - "date": "2026-06-05", - "stars": 5217 - }, - { - "date": "2026-06-06", - "stars": 5227 - }, - { - "date": "2026-06-07", - "stars": 5231 - }, - { - "date": "2026-06-08", - "stars": 5236 - }, - { - "date": "2026-06-09", - "stars": 5246 - }, - { - "date": "2026-06-10", - "stars": 5252 - }, - { - "date": "2026-06-11", - "stars": 5261 - }, - { - "date": "2026-06-12", - "stars": 5270 - }, - { - "date": "2026-06-13", - "stars": 5278 - }, - { - "date": "2026-06-14", - "stars": 5284 - }, - { - "date": "2026-06-15", - "stars": 5294 - }, - { - "date": "2026-06-16", - "stars": 5304 - }, - { - "date": "2026-06-17", - "stars": 5312 - }, - { - "date": "2026-06-18", - "stars": 5316 - }, - { - "date": "2026-06-19", - "stars": 5322 - }, - { - "date": "2026-06-20", - "stars": 5329 - }, - { - "date": "2026-06-21", - "stars": 5333 - }, - { - "date": "2026-06-22", - "stars": 5346 - }, - { - "date": "2026-06-23", - "stars": 5358 - }, - { - "date": "2026-06-24", - "stars": 5375 - }, - { - "date": "2026-06-25", - "stars": 5381 - }, - { - "date": "2026-06-26", - "stars": 5386 - }, - { - "date": "2026-06-27", - "stars": 5396 - }, - { - "date": "2026-06-28", - "stars": 5402 - }, - { - "date": "2026-06-29", - "stars": 5404 - }, - { - "date": "2026-06-30", - "stars": 5414 - }, - { - "date": "2026-07-01", - "stars": 5422 - }, - { - "date": "2026-07-02", - "stars": 5436 - }, - { - "date": "2026-07-03", - "stars": 5441 - }, - { - "date": "2026-07-04", - "stars": 5452 - }, - { - "date": "2026-07-05", - "stars": 5460 - }, - { - "date": "2026-07-06", - "stars": 5471 - }, - { - "date": "2026-07-07", - "stars": 5480 - }, - { - "date": "2026-07-08", - "stars": 5496 - }, - { - "date": "2026-07-09", - "stars": 5502 - }, - { - "date": "2026-07-10", - "stars": 5513 - }, - { - "date": "2026-07-11", - "stars": 5523 - }, - { - "date": "2026-07-12", - "stars": 5539 - }, - { - "date": "2026-07-13", - "stars": 5567 - }, - { - "date": "2026-07-14", - "stars": 5593 - }, - { - "date": "2026-07-15", - "stars": 5623 - }, - { - "date": "2026-07-16", - "stars": 5641 - }, - { - "date": "2026-07-17", - "stars": 5648 - }, - { - "date": "2026-07-18", - "stars": 5663 - }, - { - "date": "2026-07-19", - "stars": 5704 - }, - { - "date": "2026-07-20", - "stars": 5714 - }, - { - "date": "2026-07-21", - "stars": 5725 - }, - { - "date": "2026-07-22", - "stars": 5738 - }, - { - "date": "2026-07-23", - "stars": 5758 - }, - { - "date": "2026-07-24", - "stars": 5870 - }, - { - "date": "2026-07-25", - "stars": 5891 - }, - { - "date": "2026-07-26", - "stars": 5911 - }, - { - "date": "2026-07-27", - "stars": 5942 - } - ], - "generated_at": "2026-07-28T12:26:26Z", - "method": "current_stargazers_starred_at" - }, - "repository": "MarSeventh/CloudFlare-ImgBed", - "snapshots": [ - { - "at": "2026-07-28T12:29:23Z", - "stars": 5959 - } - ] - }, - { - "reconstruction": { - "daily": [ - { - "date": "2024-07-19", - "stars": 1 - }, - { - "date": "2024-07-20", - "stars": 7 - }, - { - "date": "2024-07-21", - "stars": 10 - }, - { - "date": "2024-07-22", - "stars": 12 - }, - { - "date": "2024-07-23", - "stars": 13 - }, - { - "date": "2024-07-25", - "stars": 16 - }, - { - "date": "2024-07-26", - "stars": 17 - }, - { - "date": "2024-07-27", - "stars": 18 - }, - { - "date": "2024-07-31", - "stars": 20 - }, - { - "date": "2024-08-06", - "stars": 21 - }, - { - "date": "2024-08-11", - "stars": 23 - }, - { - "date": "2024-08-13", - "stars": 24 - }, - { - "date": "2024-08-14", - "stars": 25 - }, - { - "date": "2024-08-19", - "stars": 26 - }, - { - "date": "2024-08-20", - "stars": 28 - }, - { - "date": "2024-08-22", - "stars": 29 - }, - { - "date": "2024-08-23", - "stars": 30 - }, - { - "date": "2024-08-24", - "stars": 31 - }, - { - "date": "2024-08-29", - "stars": 34 - }, - { - "date": "2024-09-01", - "stars": 35 - }, - { - "date": "2024-09-02", - "stars": 36 - }, - { - "date": "2024-09-04", - "stars": 37 - }, - { - "date": "2024-09-05", - "stars": 39 - }, - { - "date": "2024-09-06", - "stars": 40 - }, - { - "date": "2024-09-07", - "stars": 42 - }, - { - "date": "2024-09-09", - "stars": 45 - }, - { - "date": "2024-09-12", - "stars": 47 - }, - { - "date": "2024-09-13", - "stars": 48 - }, - { - "date": "2024-09-21", - "stars": 49 - }, - { - "date": "2024-09-25", - "stars": 50 - }, - { - "date": "2024-09-26", - "stars": 51 - }, - { - "date": "2024-09-29", - "stars": 52 - }, - { - "date": "2024-10-01", - "stars": 54 - }, - { - "date": "2024-10-12", - "stars": 55 - }, - { - "date": "2024-10-19", - "stars": 56 - }, - { - "date": "2024-10-20", - "stars": 57 - }, - { - "date": "2024-10-22", - "stars": 58 - }, - { - "date": "2024-11-03", - "stars": 59 - }, - { - "date": "2024-11-04", - "stars": 60 - }, - { - "date": "2024-11-12", - "stars": 61 - }, - { - "date": "2024-11-15", - "stars": 63 - }, - { - "date": "2024-11-18", - "stars": 64 - }, - { - "date": "2024-11-19", - "stars": 66 - }, - { - "date": "2024-11-23", - "stars": 67 - }, - { - "date": "2024-11-28", - "stars": 68 - }, - { - "date": "2024-11-30", - "stars": 69 - }, - { - "date": "2024-12-09", - "stars": 70 - }, - { - "date": "2024-12-10", - "stars": 72 - }, - { - "date": "2024-12-13", - "stars": 74 - }, - { - "date": "2024-12-19", - "stars": 75 - }, - { - "date": "2024-12-20", - "stars": 76 - }, - { - "date": "2024-12-26", - "stars": 77 - }, - { - "date": "2024-12-27", - "stars": 78 - }, - { - "date": "2024-12-29", - "stars": 79 - }, - { - "date": "2025-01-01", - "stars": 80 - }, - { - "date": "2025-01-07", - "stars": 81 - }, - { - "date": "2025-01-09", - "stars": 82 - }, - { - "date": "2025-01-13", - "stars": 83 - }, - { - "date": "2025-01-18", - "stars": 84 - }, - { - "date": "2025-01-28", - "stars": 86 - }, - { - "date": "2025-01-29", - "stars": 87 - }, - { - "date": "2025-02-04", - "stars": 88 - }, - { - "date": "2025-02-09", - "stars": 89 - }, - { - "date": "2025-02-11", - "stars": 91 - }, - { - "date": "2025-02-12", - "stars": 92 - }, - { - "date": "2025-02-13", - "stars": 93 - }, - { - "date": "2025-02-19", - "stars": 94 - }, - { - "date": "2025-02-22", - "stars": 95 - }, - { - "date": "2025-03-02", - "stars": 96 - }, - { - "date": "2025-03-06", - "stars": 97 - }, - { - "date": "2025-03-15", - "stars": 100 - }, - { - "date": "2025-03-18", - "stars": 101 - }, - { - "date": "2025-03-27", - "stars": 102 - }, - { - "date": "2025-03-29", - "stars": 103 - }, - { - "date": "2025-04-02", - "stars": 104 - }, - { - "date": "2025-04-03", - "stars": 106 - }, - { - "date": "2025-04-07", - "stars": 107 - }, - { - "date": "2025-04-12", - "stars": 110 - }, - { - "date": "2025-04-15", - "stars": 111 - }, - { - "date": "2025-04-20", - "stars": 112 - }, - { - "date": "2025-04-21", - "stars": 113 - }, - { - "date": "2025-04-23", - "stars": 114 - }, - { - "date": "2025-04-24", - "stars": 115 - }, - { - "date": "2025-04-25", - "stars": 116 - }, - { - "date": "2025-04-27", - "stars": 117 - }, - { - "date": "2025-05-01", - "stars": 118 - }, - { - "date": "2025-05-04", - "stars": 119 - }, - { - "date": "2025-05-13", - "stars": 120 - }, - { - "date": "2025-05-17", - "stars": 121 - }, - { - "date": "2025-06-09", - "stars": 122 - }, - { - "date": "2025-06-10", - "stars": 123 - }, - { - "date": "2025-06-14", - "stars": 124 - }, - { - "date": "2025-07-01", - "stars": 125 - }, - { - "date": "2025-07-04", - "stars": 126 - }, - { - "date": "2025-07-05", - "stars": 127 - }, - { - "date": "2025-07-12", - "stars": 128 - }, - { - "date": "2025-07-16", - "stars": 129 - }, - { - "date": "2025-07-18", - "stars": 131 - }, - { - "date": "2025-07-23", - "stars": 132 - }, - { - "date": "2025-07-24", - "stars": 133 - }, - { - "date": "2025-07-28", - "stars": 134 - }, - { - "date": "2025-08-02", - "stars": 135 - }, - { - "date": "2025-08-05", - "stars": 136 - }, - { - "date": "2025-08-20", - "stars": 137 - }, - { - "date": "2025-08-28", - "stars": 139 - }, - { - "date": "2025-08-31", - "stars": 140 - }, - { - "date": "2025-09-01", - "stars": 141 - }, - { - "date": "2025-09-04", - "stars": 142 - }, - { - "date": "2025-09-07", - "stars": 143 - }, - { - "date": "2025-09-19", - "stars": 144 - }, - { - "date": "2025-10-01", - "stars": 145 - }, - { - "date": "2025-10-14", - "stars": 146 - }, - { - "date": "2025-11-07", - "stars": 147 - }, - { - "date": "2025-11-10", - "stars": 148 - }, - { - "date": "2025-11-11", - "stars": 150 - }, - { - "date": "2025-11-20", - "stars": 151 - }, - { - "date": "2025-12-08", - "stars": 153 - }, - { - "date": "2025-12-29", - "stars": 154 - }, - { - "date": "2026-01-01", - "stars": 155 - }, - { - "date": "2026-01-04", - "stars": 156 - }, - { - "date": "2026-01-07", - "stars": 157 - }, - { - "date": "2026-01-08", - "stars": 158 - }, - { - "date": "2026-01-09", - "stars": 159 - }, - { - "date": "2026-01-17", - "stars": 160 - }, - { - "date": "2026-01-19", - "stars": 161 - }, - { - "date": "2026-01-20", - "stars": 162 - }, - { - "date": "2026-01-25", - "stars": 163 - }, - { - "date": "2026-02-03", - "stars": 164 - }, - { - "date": "2026-02-07", - "stars": 165 - }, - { - "date": "2026-02-09", - "stars": 166 - }, - { - "date": "2026-02-12", - "stars": 167 - }, - { - "date": "2026-02-14", - "stars": 168 - }, - { - "date": "2026-02-22", - "stars": 169 - }, - { - "date": "2026-02-24", - "stars": 170 - }, - { - "date": "2026-02-25", - "stars": 171 - }, - { - "date": "2026-02-27", - "stars": 172 - }, - { - "date": "2026-02-28", - "stars": 173 - }, - { - "date": "2026-03-07", - "stars": 174 - }, - { - "date": "2026-03-21", - "stars": 175 - }, - { - "date": "2026-03-25", - "stars": 176 - }, - { - "date": "2026-04-05", - "stars": 177 - }, - { - "date": "2026-04-11", - "stars": 178 - }, - { - "date": "2026-04-12", - "stars": 179 - }, - { - "date": "2026-04-14", - "stars": 180 - }, - { - "date": "2026-04-17", - "stars": 181 - }, - { - "date": "2026-04-20", - "stars": 182 - }, - { - "date": "2026-04-29", - "stars": 183 - }, - { - "date": "2026-05-05", - "stars": 184 - }, - { - "date": "2026-05-20", - "stars": 185 - }, - { - "date": "2026-05-24", - "stars": 186 - }, - { - "date": "2026-05-28", - "stars": 187 - }, - { - "date": "2026-05-31", - "stars": 188 - }, - { - "date": "2026-06-12", - "stars": 189 - }, - { - "date": "2026-06-13", - "stars": 190 - }, - { - "date": "2026-06-14", - "stars": 191 - }, - { - "date": "2026-07-02", - "stars": 192 - }, - { - "date": "2026-07-07", - "stars": 193 - }, - { - "date": "2026-07-11", - "stars": 194 - }, - { - "date": "2026-07-12", - "stars": 195 - }, - { - "date": "2026-07-15", - "stars": 196 - }, - { - "date": "2026-07-20", - "stars": 197 - }, - { - "date": "2026-07-22", - "stars": 198 - }, - { - "date": "2026-07-23", - "stars": 199 - } - ], - "generated_at": "2026-07-28T12:26:26Z", - "method": "current_stargazers_starred_at" - }, - "repository": "MarSeventh/Sanyue-ImgHub", - "snapshots": [ - { - "at": "2026-07-28T12:29:23Z", - "stars": 200 - } - ] - } - ], - "timezone": "UTC" -} diff --git a/.github/star-history/star_history.py b/.github/star-history/star_history.py index 55b0d200..477f590b 100644 --- a/.github/star-history/star_history.py +++ b/.github/star-history/star_history.py @@ -3,8 +3,8 @@ The three subcommands form one pipeline: -* ``refresh-data`` extends the public date/count cache with one GitHub - repository-metadata request per configured repository; +* ``refresh-data`` extends the public date/count cache and bootstraps missing + Pages data from GitHub's timestamped Stargazers API; * ``patch-upstream`` seeds a pinned official backend from that local cache; * ``render`` validates and saves the official localhost-rendered SVG pair. @@ -27,7 +27,7 @@ import urllib.error import urllib.parse import urllib.request import xml.etree.ElementTree as ET -from datetime import datetime, timedelta, timezone +from datetime import date, datetime, timedelta, timezone from pathlib import Path from typing import Any, Dict, List, Optional, Tuple @@ -113,7 +113,6 @@ def build_parser() -> argparse.ArgumentParser: required="STAR_HISTORY_REPOSITORIES" not in os.environ, help="Comma-separated GitHub repositories in owner/name form", ) - refresh.add_argument("--seed-file", type=Path, required=True) refresh.add_argument("--deployed-url") refresh.add_argument("--output", type=Path, required=True) refresh.add_argument( @@ -251,42 +250,6 @@ def validate_data( return payload -def validate_legacy_seed( - payload: Any, repositories: Tuple[str, ...] -) -> Dict[str, Any]: - if not isinstance(payload, dict) or payload.get("schema_version") != 2: - raise ValueError("legacy Star History seed has an unsupported schema") - series = payload.get("series") - if not isinstance(series, list) or len(series) != len(repositories): - raise ValueError("legacy Star History seed must contain every repository") - for index, repository in enumerate(repositories): - item = series[index] - if not isinstance(item, dict) or str(item.get("repository", "")).lower() != repository: - raise ValueError("legacy Star History repository order is invalid") - reconstruction = item.get("reconstruction") - snapshots = item.get("snapshots") - if not isinstance(reconstruction, dict) or not isinstance(snapshots, list): - raise ValueError("legacy Star History series is malformed") - daily = reconstruction.get("daily") - if not isinstance(daily, list): - raise ValueError("legacy Star History reconstruction is malformed") - for point in daily: - datetime.fromisoformat(point["date"]) - count = point.get("stars") - if isinstance(count, bool) or not isinstance(count, int) or count < 0: - raise ValueError("legacy Star History count is invalid") - for snapshot in snapshots: - datetime.fromisoformat(str(snapshot["at"]).replace("Z", "+00:00")) - count = snapshot.get("stars") - if isinstance(count, bool) or not isinstance(count, int) or count < 0: - raise ValueError("legacy Star History snapshot is invalid") - return payload - - -def read_json_file(path: Path) -> Dict[str, Any]: - return json.loads(path.read_text(encoding="utf-8")) - - def download_json(url: str) -> Dict[str, Any]: parsed = urllib.parse.urlsplit(url) if parsed.scheme != "https" or not parsed.netloc: @@ -305,9 +268,8 @@ def download_json(url: str) -> Dict[str, Any]: def load_best_data( *, repositories: Tuple[str, ...], - seed_file: Path, deployed_url: Optional[str], -) -> Tuple[Dict[str, Any], str]: +) -> Tuple[Optional[Dict[str, Any]], str]: if deployed_url: try: deployed = validate_data(download_json(deployed_url), repositories) @@ -322,17 +284,13 @@ def load_best_data( "deployed Pages cache request failed; preserving the last " "deployment: HTTP {0}".format(status) ) from exc - print("[data] deployed cache not found; using repository seed") + print("[data] deployed cache not found; initializing from GitHub API") except (OSError, ValueError, json.JSONDecodeError, urllib.error.URLError) as exc: raise RuntimeError( "deployed Pages cache is unavailable or invalid; preserving " "the last deployment: {0}".format(exc) ) from exc - seed = read_json_file(seed_file) - try: - return validate_data(seed, repositories), "repository seed" - except ValueError: - return validate_legacy_seed(seed, repositories), "legacy repository seed" + return None, "GitHub Stargazers API" def fetch_repository_metadata(repository: str, token: str) -> Dict[str, Any]: @@ -373,6 +331,79 @@ def fetch_repository_metadata(repository: str, token: str) -> Dict[str, Any]: raise RuntimeError("GitHub repository metadata request failed: {0}".format(last_error)) +def fetch_stargazer_timestamps(repository: str, token: str) -> List[datetime]: + timestamps: List[datetime] = [] + page = 1 + + while True: + url = ( + "https://api.github.com/repos/{0}/stargazers?per_page=100&page={1}" + ).format(repository, page) + request = urllib.request.Request( + url, + headers={ + "Accept": "application/vnd.github.star+json", + "Authorization": "Bearer {0}".format(token), + "User-Agent": USER_AGENT, + "X-GitHub-Api-Version": "2022-11-28", + }, + ) + last_error: Optional[Exception] = None + page_timestamps: Optional[List[datetime]] = None + has_next_page = False + + for attempt in range(1, 4): + try: + with urllib.request.urlopen(request, timeout=30) as response: + body = response.read(MAX_JSON_BYTES + 1) + link_header = response.headers.get("Link", "") + if len(body) > MAX_JSON_BYTES: + raise ValueError("GitHub Stargazers API response is too large") + payload = json.loads(body.decode("utf-8")) + if not isinstance(payload, list): + raise ValueError("GitHub Stargazers API returned a non-array payload") + + parsed_page: List[datetime] = [] + for item in payload: + if not isinstance(item, dict): + raise ValueError("GitHub Stargazers API returned an invalid item") + starred_at = item.get("starred_at") + if not isinstance(starred_at, str): + raise ValueError("GitHub Stargazers API omitted starred_at") + parsed_page.append( + datetime.fromisoformat( + starred_at.replace("Z", "+00:00") + ).astimezone(timezone.utc) + ) + page_timestamps = parsed_page + has_next_page = 'rel="next"' in link_header + break + except ( + OSError, + ValueError, + json.JSONDecodeError, + urllib.error.URLError, + ) as exc: + last_error = exc + if attempt < 3: + time.sleep(attempt * 2) + + if page_timestamps is None: + raise RuntimeError( + "GitHub Stargazers API request failed for {0} page {1}: {2}".format( + repository, page, last_error + ) + ) + + timestamps.extend(page_timestamps) + if not has_next_page: + break + page += 1 + + timestamps.sort() + return timestamps + + def download_avatar_data_url(url: str) -> str: parsed = urllib.parse.urlsplit(url) if parsed.scheme != "https" or parsed.hostname != "avatars.githubusercontent.com": @@ -392,6 +423,75 @@ def download_avatar_data_url(url: str) -> str: ) +def initialize_from_github( + *, + repositories: Tuple[str, ...], + metadata: Dict[str, Dict[str, Any]], + token: str, + current_time: datetime, +) -> Dict[str, Any]: + avatar_cache: Dict[str, str] = {} + runtime_series: List[Dict[str, Any]] = [] + + for repository in repositories: + created_at = datetime.fromisoformat( + metadata[repository]["created_at"].replace("Z", "+00:00") + ).astimezone(timezone.utc).replace(microsecond=0) + current_second = current_time.astimezone(timezone.utc).replace(microsecond=0) + if created_at >= current_second: + created_at = current_second - timedelta(seconds=1) + + daily_records: Dict[date, Tuple[datetime, int]] = {} + timestamps = fetch_stargazer_timestamps(repository, token) + for count, starred_at in enumerate(timestamps, start=1): + if starred_at > current_time: + raise ValueError( + "GitHub Stargazers API returned a future timestamp for {0}".format( + repository + ) + ) + daily_records[starred_at.date()] = (starred_at, count) + + records_by_time: Dict[datetime, int] = {created_at: 0} + for starred_at, count in daily_records.values(): + records_by_time[starred_at] = count + record_points = sorted(records_by_time.items()) + if len(record_points) < 2: + record_points.append((current_second, len(timestamps))) + + avatar_url = metadata[repository]["avatar_url"] + if avatar_url not in avatar_cache: + avatar_cache[avatar_url] = download_avatar_data_url(avatar_url) + series = { + "repository": repository, + "logo_url": avatar_cache[avatar_url], + "star_records": [ + {"date": format_record_date(at), "count": count} + for at, count in record_points + ], + } + series, _ = update_current_record( + series, + repository=repository, + star_count=metadata[repository]["star_count"], + current_time=current_time, + ) + runtime_series.append(series) + print( + "[data] initialized {0} from {1} timestamped stargazers".format( + repository, len(timestamps) + ) + ) + + initialized = { + "format": DATA_FORMAT, + "schema_version": SCHEMA_VERSION, + "updated_at": current_time.isoformat().replace("+00:00", "Z"), + "series": runtime_series, + } + return validate_data(initialized, repositories) + + def update_current_record( payload: Dict[str, Any], *, @@ -417,59 +517,6 @@ def update_current_record( return updated, True -def migrate_legacy_seed( - payload: Dict[str, Any], - *, - repositories: Tuple[str, ...], - metadata: Dict[str, Dict[str, Any]], - current_time: datetime, -) -> Dict[str, Any]: - validate_legacy_seed(payload, repositories) - avatar_cache: Dict[str, str] = {} - runtime_series: List[Dict[str, Any]] = [] - for index, repository in enumerate(repositories): - legacy = payload["series"][index] - records_by_time: Dict[datetime, int] = {} - for point in legacy["reconstruction"]["daily"]: - point_day = datetime.fromisoformat(point["date"]).date() - end_of_day = datetime( - point_day.year, - point_day.month, - point_day.day, - tzinfo=timezone.utc, - ) + timedelta(days=1) - records_by_time[end_of_day] = point["stars"] - for snapshot in legacy["snapshots"]: - at = datetime.fromisoformat(snapshot["at"].replace("Z", "+00:00")) - records_by_time[at.astimezone(timezone.utc)] = snapshot["stars"] - records = [ - {"date": format_record_date(at), "count": records_by_time[at]} - for at in sorted(records_by_time) - ] - avatar_url = metadata[repository]["avatar_url"] - if avatar_url not in avatar_cache: - avatar_cache[avatar_url] = download_avatar_data_url(avatar_url) - series = { - "repository": repository, - "logo_url": avatar_cache[avatar_url], - "star_records": records, - } - series, _ = update_current_record( - series, - repository=repository, - star_count=metadata[repository]["star_count"], - current_time=current_time, - ) - runtime_series.append(series) - migrated = { - "format": DATA_FORMAT, - "schema_version": SCHEMA_VERSION, - "updated_at": current_time.isoformat().replace("+00:00", "Z"), - "series": runtime_series, - } - return validate_data(migrated, repositories) - - def atomic_write_json(path: Path, payload: Dict[str, Any]) -> None: path.parent.mkdir(parents=True, exist_ok=True) content = json.dumps(payload, ensure_ascii=False, indent=2) + "\n" @@ -500,7 +547,6 @@ def refresh_data_command(args: argparse.Namespace) -> int: try: payload, source = load_best_data( repositories=repositories, - seed_file=args.seed_file, deployed_url=args.deployed_url, ) metadata = { @@ -508,14 +554,13 @@ def refresh_data_command(args: argparse.Namespace) -> int: for repository in repositories } current_time = datetime.now(timezone.utc) - if payload.get("format") != DATA_FORMAT: - updated = migrate_legacy_seed( - payload, + if payload is None: + updated = initialize_from_github( repositories=repositories, metadata=metadata, + token=token, current_time=current_time, ) - source = "legacy repository seed" else: updated = copy.deepcopy(payload) changed = False diff --git a/.github/workflows/sync-star-history.yml b/.github/workflows/sync-star-history.yml index 46001bc3..b3ecc58a 100644 --- a/.github/workflows/sync-star-history.yml +++ b/.github/workflows/sync-star-history.yml @@ -27,6 +27,7 @@ env: jobs: render-and-deploy: name: Render with official source and deploy to Pages + if: ${{ github.repository == 'MarSeventh/CloudFlare-ImgBed' }} runs-on: ubuntu-latest timeout-minutes: 15 environment: @@ -72,9 +73,9 @@ jobs: id: render shell: bash env: - # One repository-metadata request per configured repository reads the - # current totals. Individual - # stargazers and the hosted Star History chart service are not queried. + # Normal refreshes read the deployed Pages cache and current repository + # totals. A missing Pages cache is initialized once from timestamped + # stargazers; the hosted Star History chart service is never queried. GITHUB_JOB_TOKEN: ${{ github.token }} run: | set -euo pipefail @@ -95,11 +96,10 @@ jobs: } trap cleanup EXIT - # Pages JSON is the runtime source of truth. The committed bootstrap - # seed is used only when the first deployment path returns HTTP 404. + # Pages JSON is the runtime source of truth. On a first deployment, + # the script reconstructs history from GitHub's Stargazers API. python3 .github/star-history/star_history.py refresh-data \ --repository "${STAR_HISTORY_REPOSITORIES}" \ - --seed-file .github/star-history/history.json \ --deployed-url "${STAR_HISTORY_PAGES_URL}/star-history-data.json" \ --output "${data_file}" \ --token-env GITHUB_JOB_TOKEN