Hosting a snapshot
Hosting a snapshot
speckit-eye --build writes the same overview, feature pages and document
pages as serve mode, as plain static files. Any static host can serve them:
there is no server-side logic, pages open directly by their address, the tree,
phases, task rows and document sections open and close without JavaScript,
and nothing is loaded from other servers. The stylesheet, the bundled fonts,
the browser scripts and the search index are written into assets/ beside the
pages, so the theme switch, task map, filters, reader and search work the same
as in serve mode. A hosted snapshot has no live updates; each page footer
shows when it was generated.
npx speckit-eye --build . --out _site --base /my-repo/
--outis the folder to write. It is created if missing. It must not be the project folder itself or lie insidespecs/or.specify/.--baseis the URL path the site is served under (default/). For GitHub Pages project sites this is/<repository name>/. Every link, script and the search index use this path; the fonts are referenced relative to the stylesheet, so they load under any base.--home <url>(optional) adds a “Home” link to<url>on every page, for a snapshot that is part of a larger site. It must be an absolutehttp://orhttps://address. For example, a dashboard published understatus/of a docs site that links back to the docs home:npx speckit-eye --build . --out site/status --base /my-repo/status/ --home https://example.github.io/my-repo/speckit-eye’s own documentation site does exactly this: its project status page is this repository’s dashboard, with a Home link back to the docs.
A second build into the same folder replaces the previous one, with no stale pages left behind. The tool recognizes its own output by the
.speckit-eye-buildfile it writes there. It refuses to write into any other folder that is not empty, and changes nothing in it (exit code 2).
If you build locally into a folder inside your repository, add that folder
(for example _site/) to .gitignore.
What a hosted build exposes
[!WARNING] A hosted build publishes every document of the project. The site contains every spec, plan, research note, data model, contract, checklist, the constitution and every idea assessment under
.specify/assessments/. Anyone who can reach the site can read all of it, unless your host restricts access. GitHub Pages sites of public repositories are public; check your host’s access settings before you publish a private project. There is no option to leave documents out.
The build prints the same reminder when it finishes.
GitHub Pages
Add this workflow as .github/workflows/speckit-eye.yml, then set
Settings → Pages → Build and deployment → Source to GitHub Actions. Each
push to main builds the snapshot and publishes it at
https://<user or org>.github.io/<repository>/ within the same run.
[!WARNING] This job makes the specs, research, constitution and assessments readable by anyone who can reach the Pages site unless the host restricts access (see What a hosted build exposes).
name: speckit-eye snapshot
on:
push:
branches: [main]
workflow_dispatch:
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: pages
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npx speckit-eye --build . --out _site --base /${{ github.event.repository.name }}/
- uses: actions/upload-pages-artifact@v3
with:
path: _site
deploy:
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- id: deployment
uses: actions/deploy-pages@v4
For a user or organization site (<user>.github.io) or a custom domain, the
site is served at the root: use --base / instead.
Which feature is active in CI
The overview opens the active feature (see What is active). In CI this is usually not the feature you are working on locally:
.specify/feature.jsonis git-ignored by Spec Kit, so it is not in the checkout.actions/checkoutchecks outmainfor a push and a detached HEAD for a pull request, and these rarely match a feature folder name.
So a hosted snapshot normally opens the first feature (in folder order) that still has open tasks. Everything else on the page is the same as locally.
Netlify
Set the build command to npx speckit-eye --build . --out _site and the
publish directory to _site. A Netlify site is served at the root of its
domain, so the default base / fits. Use Netlify’s access controls (for
example password protection) if the snapshot must not be public.
Other hosts
Build with --base set to the path the site will be served under, and upload
the --out folder as it is. The host needs no rewrite rules: every page is a
real .html file, and index.html is the overview.