Source of xorio.rs — the project showcase of the xorio open-source collective.
Plain static HTML, no framework: a small dependency-free Node script (build.js) turns src/ into finished pages in dist/. Vercel runs it on every deploy and serves dist/; nothing generated is committed.
| Path | What |
|---|---|
src/data.js |
All content — projects, groups, filters, experiments, contacts, About copy. Edit this. |
src/render.js |
HTML templates (pure functions, build-time only). |
src/shell.html |
Page shell: <head>, nav, footer. {{a:path}} tokens become cache-busted asset URLs. |
src/styles.css |
The stylesheet (self-hosted fonts, light/dark themes, responsive rules). |
src/app.js |
Browser JS: theme switch, gallery filter/search, the hero terminal, legacy #hash redirects. |
src/theme.js |
Tiny pre-paint script that applies the saved theme (dark by default) without a flash. |
src/privacy.html |
Body of the privacy policy. |
src/shots/ |
Source screenshots (PNG). Files starting with _ are art sources for the CSS-rendered repo cards. |
project/assets/img/ |
Optimised images generated from src/shots/ (npm run images). |
project/assets/fonts/ |
Self-hosted Space Grotesk, IBM Plex Sans, JetBrains Mono (latin, variable). |
project/data/stats.json |
Hand-maintained ★ counts for cards and project pages. |
project/docs/ |
PDFs linked from the About page. |
build.js |
Writes dist/: index.html, f/<key>.html, p/<id>.html, about.html, experiments.html, contribute.html, privacy.html, 404.html, sitemap.xml, robots.txt, the CSS/JS from src/, and a copy of project/assets/ and project/docs/. |
dist/ |
Build output. Gitignored — never edit it; it is regenerated on every build. |
tools/ |
dev.js (npm run dev: rebuild + live reload), serve.js (serves dist/ with Vercel-style clean URLs and headers), images.js (sharp pipeline). |
design/ |
The original Claude Design handoff bundle (prototypes, chat transcript, brand sources). Not deployed. |
vercel.json |
Build command and output directory, clean URLs, immutable caching for /project/assets, security headers and CSP. |
Only dist/ is served, so src/, design/ and tooling are never public. .vercelignore also keeps design/ and tools/ out of the upload.
- Change
src/data.js(add a project, fix a blurb, add an experiment…). - If you added a screenshot, drop
src/shots/<id>.png(1280 px wide is plenty) and setshot:'<id>'on the project. Repositories without a screenshot get a CSS-rendered card automatically; setart:'<name>'to decorate it withproject/assets/img/art-<name>.webp. - Preview:
npm run dev # http://localhost:8000 — rebuilds and reloads the browser on every save
npm install # only needed for `npm run images` (sharp)
npm run images # only if screenshots changed; commit the new project/assets/img/ filesnpm run dev serves dist/ with the same clean URLs, headers and CSP as production. A failed build keeps the last good version on screen and shows the error over the page. npm run serve is the same without watching.
- Commit the source changes only (
dist/is gitignored). Pushing tomaindeploys: Vercel runsnode build.jsand publishesdist/. TheBuild siteworkflow builds every push and pull request, so a broken build fails CI before it reaches a deploy.
project/data/stats.json holds the ★ counts shown on cards and the "on GitHub" panel of project pages; update the numbers by hand when you like. The founder cards on the About page (stars, followers, repos, top languages) are fetched in the browser from the GitHub API and cached for a day per visitor — no build step, no bot commits, always current. The contribution-streak card is the hosted widget from github-readme-streak-stats.
Every page has a real path (/p/rencfs, /about, …) with its own title, description and social-preview image (project/assets/img/<shot>-og.jpg, or project/assets/og.jpg). Gallery filters are real pages too (/f/oss, /f/ai, …), prerendered with the filter applied and switched in place by app.js; the "All" chip is /. The old #p/<id>, #f/<key> and #about hash links redirect client-side.
- The contributing guide link points at
xoriors/rencfs. An org-levelxoriors/.githubrepository with aCONTRIBUTING.mdwould cover every project — updateSITE.contributingwhen it exists.