π About This Project: GitHub Skylh Universe Inspiration
My GitHub profile held hundreds of repositories, but it read as a flat list, not a universe. Original work and forks were mixed together, sorted only by update time. An audit made the problem measurable:
π
π original + π
fork
13 +
310
323 , π
original
13 323 β 4.02 % N=N original β
+N fork β
=13+310=323,p original β
= 323 13 β
β4.02%
Only about 4% was truly mine; the rest was what I had learned from. I wanted a star map: originals as stars, forks as planets, grouped into galaxies by field, each showing its real distance from its upstream.
What I Learned
First, data is a product. Raw API descriptions are too uneven to display, so every repository needed a curated profile covering its problem, quickstart, deployment, architecture, and upstream health. Second, classification is an opinion, so I score each repository against each domain instead of relying on keyword matching alone:
π
^
arg β‘ max β‘ π β π π€ π β 1 [ π π β tokens ( π ) ] c ^ =arg c max β
i β β
w i β
β 1[k i β
βtokens(r)]
Third, honesty is a design feature. Labeling 96% of the collection as forks does not weaken the portfolio; mislabeling it would.
How I Built It
A Python engine, scripts/sync_metadata.py, pulls all repositories through the GitHub CLI and REST API, classifies them into eight domains β AI agents, LLM tooling, reverse engineering, developer infrastructure, web applications, knowledge bases, Web3 security, and experiments β and writes a static repos.json. A React 18 + Vite 5 + Tailwind CSS single-page app renders it with full-text search, multi-dimensional filters, and grid/table views. Fork pages probe their upstream live for stars, issues, releases, and sync divergence, Ξ
sync
π΄ β π΅ Ξ sync β
=AβB . GitHub Actions rebuilds and deploys to GitHub Pages on every push and daily at 02:00 UTC, so staleness is bounded by π max
β‘
24 β h T max β
=24h .
Challenges
The hardest problem was API quota versus "real time": unauthenticated requests allow only 60 per hour. I combined a static snapshot, on-demand client probes, and a five-minute cache, cutting effective requests to π
eff
π ( 1 β β ) R eff β
=R(1βh) at the cost of at most 300 seconds of staleness. Other challenges were empty or template-generated descriptions, multi-domain repositories that resisted single labels, and rendering 323 cards without lag β solved through curation, weighted scoring with secondary tags, and deliberately simple linear search.
The lesson endures: a universe does not need to be large. It needs to be true.