A ready-to-deploy template for shipping a KeroxLabs product page to
keroxlabs.github.io/<repo>. Every tool in the arsenal gets its own
repo and its own page at a subpath of the lab's domain — no central
routing, no shared build.
GitHub Pages maps repos to URLs by convention:
| Repo | URL |
|---|---|
keroxlabs/keroxlabs.github.io |
keroxlabs.github.io/ (the hub) |
keroxlabs/<product> |
keroxlabs.github.io/<product>/ (this template) |
So the URL is automatic — you only have to give the repo a page to serve and enable Pages once.
-
Create the repo from this template. On GitHub: Use this template → Create a new repository under the
keroxlabsorg, named after the tool (e.g.glyph). Or with the CLI:gh repo create keroxlabs/<product> --public --template keroxlabs/product-template
-
Fill in
site/index.html. Replace everyTODO/PRODUCT/L?placeholder: name, tagline, arsenal level, the real run command, and the capability cells. The styling already matches the hub — leave the design tokens alone so the ecosystem stays consistent. -
Enable Pages once, then push.
gh api -X POST repos/keroxlabs/<product>/pages -f build_type=workflow git push origin main
(Or in the UI: Settings → Pages → Source = "GitHub Actions".) Every push to
mainthereafter redeploys automatically via.github/workflows/pages.yml.
Live in ~1 minute at https://keroxlabs.github.io/<product>/.
site/
index.html the product page (edit this)
logo.jpg the shared KeroxLabs cobra — keep for brand consistency
.github/workflows/
pages.yml builds ./site and deploys to Pages on push to main
The page lives under /<product>/, not the domain root. Reference assets
relatively (./logo.jpg, ./screenshot.png) — never with a leading
slash (/logo.jpg), which would resolve to the hub's root and 404. With
relative paths the same site/ works at any subpath with zero config.
If a product needs a framework (Next.js, Vite, Astro), keep this same
pages.yml shape but add a build step and tell the build its subpath —
otherwise assets resolve to the domain root and 404:
- Next.js —
basePath: '/<product>'+images: { unoptimized: true }, outputout/, upload./out. - Vite —
base: '/<product>/', upload./dist. - Astro —
base: '/<product>', upload./dist.
Derive the subpath from the repo name in CI
(${{ github.event.repository.name }}) so it's never hardcoded.
Hub: https://keroxlabs.github.io · Org: https://github.com/keroxlabs