🌌 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.

Built With

Share this project:

Updates

Submission history