pages
Static sites for tests and previews. Upload a built folder, get https://<id>.pages.<d>; aliases give
stable names and custom domains. Binary: pagesd. Runs on the platform since 2026-10-09 (v2).
v1 (repo pages up to v0.1.1; replaced)
- Immutable deploys (
sites/<id>/), aliases with history and rollback, TTL and prune, keep, passwords
(per deploy, per alias, server default), SPA mode, _redirects and _headers (Netlify / Cloudflare
syntax), 404.html, custom domains on aliases verified by TXT with on-demand certificates.
- Accounts with passkeys (RP ID
pages.xvii.network), roles user / superuser, per-user quotas,
scoped API tokens (xp_…: read, deploy, full), sign-in links, pagesd recover.
- Activity log (
audit.jsonl), page views per deploy and alias (hourly, 7 days), file listings with
hashes and diffs between deploys, QR codes.
- Panel: responsive, ⌘K, en/ru. CLI:
xvii pages … (the cli package, mounted by xvii), browser
sign-in through xvii login, --watch, QR codes. Module go.xvii.network/pages on kit.
- GitLab CI template at
/ci/preview.yml: previews per branch, environment links in merge requests,
cleanup on merge.
- Storage: JSON files under
/var/lib/xvii-pages/.
Status 2026-10-09: done. pages v2 ran beside v1 under a second host name (an xvii-node host override),
took v1's data and tokens with the importer, then took over v1's host the same day; v1 is removed. Done: sign-in through id, teams with
visibility and roles, PostgreSQL metadata (sites stay on disk), limits from id (ADR 0013: pages.deploys,
pages.storage, pages.deploy_size, team and project, usage reported back), the importer, @xvii panel with a team switcher, quotas page, xvii pages on id sign-in with --team,
--project, --env; manifest settings shown in home. CI deploys without stored secrets through id trust rules
(ci/pages.yml in the ci repo, /ci/preview.yml and /ci/github.yml served by pagesd); MCP tools at
/mcp (list, inspect, deploy files, aliases, rollback, access, lifetime, diff, activity), bridged by
xvii mcp. Left: events to notify once it exists.
Plan, as it was:
- Sign-in through
id (OIDC); drop internal/accounts, local passkeys, sessions and xp_ tokens.
- Deploys and aliases belong to a team and optionally a project and environment; visibility per team
(ADR 0005). Quotas per team (deploy count, total size, max deploy size).
- PostgreSQL instead of JSON for metadata (
kit/db); site files stay on disk under
/var/lib/xvii/pages/sites/. A one-time importer reads the old state.json, audit.jsonl,
visits.json and assigns everything to the first superuser's personal team.
- Shared code from
kit (config, auth, audit, events, HTTP) and panel shell from @xvii.
- CI templates for GitLab (job token exchange instead of a stored token) and GitHub Actions.
- MCP tools: deploy a folder or archive, list, alias, rollback, password, TTL, diff.
- Events to
notify (deploy created, alias moved, domain verified or failing, quota near limit).
- Service manifest for
xvii-node; data and Caddy paths move from /var/lib/xvii-pages and
/etc/xvii-pages to the platform layout.
Later
Server-side builds from a repository (through apps builders), deeper analytics through analytics
(script injection per alias, opt-in), image optimization, edge-ish cache headers presets.