Everything I've built, on one board. The deck is a dashboard-style portfolio:
- KPI tiles across the top: projects, live sites, interests, contributions, latest push
- a filter for each interest, plus search by name or stack
- a bento grid where flagship projects get the big tiles
- a detail drawer for each project, with why it exists, highlights, stack and links
Live: https://observation-deck.netlify.app/
projects.jsonis the single source of truth. It has three parts:profile: the handle and the stats used in the KPI tiles.constellations: the interest groups, each with a name, colour and blurb. They drive the filter buttons and tile colours. The key name dates from the earlier star-chart design.projects: one entry per project.constellationsets its interest. These optional fields change how it's shown:url: the live siterepo: the GitHub repo nameimage: your own screenshot instead of a captured oneimageFit: "portrait": for phone screenshotsflagship: big 2×2 tileprivate/work: no source link, plus a badgehidden: kept in the manifest but not shownstarted: used by the "Newest" sortstackandcaseStudy: tech tags and the drawer
scripts/capture-screenshots.jsvisits every project with aurlusing Puppeteer. It saves a WebP screenshot toimages/(unless the project has its ownimage) and writesstatus.json: up/down, response time, capture date.scripts/sync-github.jswritesgithub.jsonwith stars and last-push dates for everyrepo, plus the contributions-in-the-last-year total for the KPI tile (the same number as the GitHub profile graph, private contributions included).- It needs a token for GraphQL; the Actions token is enough. Locally:
GITHUB_TOKEN=$(gh auth token) npm run github.
- It needs a token for GraphQL; the Actions token is enough. Locally:
- A weekly GitHub Action runs both scripts and commits the results, so the live badges and KPI tiles stay current.
index.htmlrenders everything with no build step. Projects without a screenshot get a generated bar-chart tile in their interest's colour. The design is dark-only (color-scheme: dark).- Every project has a shareable link,
/#p-<id>, that opens its drawer.
npm install
npm run screenshots # refresh images/*.webp and status.json
npm run github # refresh github.json (set GITHUB_TOKEN to avoid rate limits)
python -m http.server 5500 # preview at http://localhost:5500