GitHub Archaeology: Input a Username, Get a 71KB Single-File 'Programming Personality' Excavation
Browser-only GitHub tools can skip OAuth, but they hit GitHub's 60-request-per-hour anonymous cap and a canvas taint trap that only fires at export time. The patterns here, degrading optional endpoints, grading errors, and shipping built-in demo data, keep a no-backend app usable when the API says no.
GitHub Archaeology Lab treats a GitHub account as a dig site. Feed it a username and it pulls the user profile, up to 100 pushed repositories, and public events from unauthenticated API endpoints, then does all the calculations in the browser. The output is a four-part profile: a language 'growth ring' donut chart, scores on night-owl commit hours, naming neatness, language breadth and open-source social reach, and four 'artifacts' such as the oldest repository, the heaviest repo, the most-starred repo, and a naming fossil. The four scores combine into one of 16 personality types with a one-line verdict, and the whole thing exports as a 1080x1440 card with a stamp and topic tags.
The implementation deliberately avoids any backend. It is one 71KB index.html with vanilla JS, no CDN links, no build step, and system fonts. Three public endpoints replace OAuth. Optional event data is wrapped in a catch so a failure only degrades the night-owl score. Errors are graded: 404 means the user does not exist, 403/429 means rate-limited. The unauthenticated GitHub limit of 60 requests per hour gets an offline fallback to a built-in demo profile. The share-card export uses Canvas, which requires setting img.crossOrigin to 'anonymous' before drawing; without it, the canvas is tainted and toBlob throws a SecurityError that hides several lines away from the actual cause.
The archaeology metaphor did the information architecture work: repositories became strata, languages became growth rings, repo size became artifacts, and commit times became activity cross-sections, which turned a dull feature list into a story.
A no-backend tool lives or dies by degradation; the separate catch on events, the graded 404/403/429 messages, and the embedded demo profile turn API failures into small gaps instead of a dead end.
Canvas tainting shows how deferred browser API errors can be: drawImage is silent, and the SecurityError appears only at toBlob, so a runnable preview beats reading the docs.
Skipping OAuth and storing nothing is also a product decision: it removes the scary permission screen and keeps the privacy promise short enough for one sentence.