You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Elijah Voigt 46e7a3dae5 feat(pages): add removable page aliases (serve-direct)
A page keeps one canonical slug and can have up to 10 long-lived,
removable aliases in the same URL namespace. Serving is serve-direct:
routes::serve falls back to Db::get_page_by_alias on a canonical miss
and serves the canonical page's R2 content under its <slug>/ prefix — no
redirect, no second copy, and a real page always wins over an alias of
the same name.

- migrations: new `aliases` table + idx_aliases_slug (schema.sql +
  idempotent 0003-aliases.sql).
- db.rs: get_page_by_alias, insert_alias (NameTaken on collision),
  delete_alias (page-scoped), list/count/delete-for-page, alias_exists.
- api.rs: POST /api/pages/:slug/aliases (can_upload + owner-or-admin) and
  DELETE /api/pages/:slug/aliases/:alias (owner-or-admin); create_page
  rejects a name held by an alias; delete_page removes a page's aliases;
  GET /api/pages returns each page's aliases[].
- Namespace uniqueness across pages.slug + aliases.alias is enforced in
  the handlers (SQLite can't express the cross-table rule).
- Frontend: alias chips (× to remove) + an "Add alias" button.

Replaces the earlier rename+conditional-redirect idea (dropped for
301-cache fragility). No R2 or behavioral change to existing pages.
196 unit + 20 doctests, both-target clippy clean.

Bean: pages-9lsk.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 day ago
..
pages-9lsk--page-aliases-multiple-long-lived-names-per-page-se.md feat(pages): add removable page aliases (serve-direct) 1 day ago
pages-77lk--pages-static-site-host-on-cloudflare-v0.md feat(pages): static-site host at pages.elijah.run (v0) 1 week ago
pages-aalu--normalize-path-segments-so-prefixed-tar-entries-ar.md fix(pages): normalize '.' path segments so ./-prefixed tar entries upload 1 day ago
pages-adl9--page-content-serving-from-r2.md feat(pages): static-site host at pages.elijah.run (v0) 1 week ago
pages-g39t--support-targz-tgz-uploads-gzip.md feat(pages): accept gzip/zstd/xz compressed tar uploads 2 days ago
pages-ihlp--opentofu-infra-deployment-docs-project-docs-polish.md feat(pages): static-site host at pages.elijah.run (v0) 1 week ago
pages-jaqz--embedded-management-ui-staticindexhtml.md feat(pages): static-site host at pages.elijah.run (v0) 1 week ago
pages-jgc4--d1-schema-and-query-layer.md feat(pages): static-site host at pages.elijah.run (v0) 1 week ago
pages-kns6--pages-and-users-json-api.md feat(pages): static-site host at pages.elijah.run (v0) 1 week ago
pages-lxjz--scaffold-worker-crate-hello-world-builds.md feat(pages): static-site host at pages.elijah.run (v0) 1 week ago
pages-r4ob--upload-dispatch-foundation-magic-byte-sniffing-tar.md feat(pages): accept gzip/zstd/xz compressed tar uploads 2 days ago
pages-saom--core-policy-modules-slug-mime-upload-validation-he.md feat(pages): static-site host at pages.elijah.run (v0) 1 week ago
pages-shqc--per-page-and-per-user-trust-opt-out-of-csp-sandbox.md feat(pages): static-site host at pages.elijah.run (v0) 1 week ago
pages-u3zc--support-tarxz-uploads-xzlzma2.md feat(pages): accept gzip/zstd/xz compressed tar uploads 2 days ago
pages-ufk2--raise-upload-limits-per-file-16-mib-total-48-mib-b.md feat(pages): raise upload limits for large wasm (per-file 16 MiB, total 48 MiB) 1 day ago
pages-w7ow--accept-targz-tarzst-tarxz-archive-uploads.md feat(pages): accept gzip/zstd/xz compressed tar uploads 2 days ago
pages-wadp--support-tarzst-uploads-zstd.md feat(pages): accept gzip/zstd/xz compressed tar uploads 2 days ago
pages-yhxp--raise-per-file-upload-limit-to-32-mib-for-large-wa.md feat(pages): raise per-file upload limit to 32 MiB for large wasm 1 day ago
pages-ytau--update-a-page-in-place-re-upload-content-put-apipa.md feat(pages): update a page in place via re-upload [pages-ytau] 1 week ago
pages-zd46--github-oauth-sessions-auth-middleware.md feat(pages): static-site host at pages.elijah.run (v0) 1 week ago