scrml.dev v0.8.0
<page> · scrml reference
Reference › Elements

<page>

Route declaration. Routes come from the filesystem: a file under pages/ is a route. Lives as a standalone file under pages/, or inside the entry-file program.

Core multi-page-app surface SPEC §40.8 (normative)

Syntax

<page [auth="required"] [db="./app.db"] [csrf=…] [ratelimit=…] [keep-alive]>
  <!-- page body -->
</page>

Two placement shapes:

  • Inline in entry file. A <page> declared inside the entry-file <program> body. Useful for small apps.
  • Standalone file under pages/. A <page> declared as the root element of a file under pages/. The filesystem path determines the route; no path= attribute needed. Canonical multi-page-app shape.

Worked example

Filesystem layout for a four-page app. Each file is a standalone <page> root; the filesystem determines routes.

app.scrml                       <program> root + nav chrome
pages/
  index.scrml                   /
  about.scrml                   /about
  reference/
    index.scrml                 /reference
    elements/
      engine.scrml              /reference/elements/engine

Inside each page file:

<page>
  <article>
    Page content here.
  </article>
</page>

The compiler reads the pages/ tree (per SPEC §40.8.1 filesystem-inferred multi- page-app shape) and emits per-route artifacts. Approach A closure analysis runs per page; each route ships its own chunk set.

Semantics

  • Filesystem-inferred routing. Per SPEC §40.8.1, when a project has a pages/ directory at the project root, the compiler treats the project as a multi-page app. Each .scrml file under pages/ becomes a route; the file path (minus .scrml) is the URL.
  • SPA shape if no pages/ exists. Projects with a top-level <program> but no pages/ directory and no <page> children are inferred as SPAs (W-PROGRAM-SPA-INFERRED info-level lint surfaces the inference).
  • Auth inheritance. A <page> nested inside an <auth role="X"> wrapper inherits the role unless it has its own auth= attribute. The compiler emits W-AUTH-PAGE-INFERRED info-level when the inference applies, so the inheritance is auditable.
  • Per-route artifacts. Each page gets its own initial chunk + tier-1 idle-prefetch + tier-2 hover-prefetch + tier-N on-demand chunks (Approach A artifact splitter, v0.3.0). The chunk filenames embed an FNV-1a content hash for adopter-cache stability.
  • Per-role chunk variance. For routes nested inside <auth role=>, the splitter emits role-specific chunks. Anonymous visitors download strictly smaller initial bundles than logged-in roles.

Errors this feature can fire

Edge cases

  • Index resolution. A file at pages/reference/index.scrml serves the route /reference — the index suffix is the canonical "directory landing" form. Alternative file shape pages/reference.scrml serves the same route — equivalent semantics per route inference.
  • No path= attribute. The attributes a <page> accepts are exactly db, auth, csrf, ratelimit and keep-alive; anything else, including path=, is E-PAGE-INVALID-ATTR. The file's position under pages/ is the route.
  • routes/ alias. routes/ is recognized as a synonym of pages/. Pick one; don't mix in the same project.
  • Pages do NOT nest. A <page> inside another <page> is invalid. For nested routes, use the filesystem hierarchy (pages/parent/child.scrml).

Related features

  • <program> — root container; documents the multi- page shape via filesystem-routed page children.
  • <auth role=> — per-role visibility wrapper for pages; drives per-role chunk variance.
  • chunks.json — the per-route per-role manifest. Inspect to see what each route ships.
  • data-scrml-prefetch — markup attribute the compiler emits on internal links for tier-2 hover-prefetch.

Availability

Surface Since Notes
filesystem-inferred multi-page-app shape SPEC §40.8.1 Top-level pages/ tree triggers multi-page mode
pages/ canonical prefix v0.3 buildPageRouteTree recognizes both pages/ and routes/
Per-route artifact splitter v0.3 7 sub-phases; FNV-1a content-addressed chunks
Per-role chunk variance v0.3.0 (A-3 AuthGraph) Anonymous visitors download strictly smaller initial bundles

Specification

This page summarizes SPEC §40.8 (multi-page-app shape) and §40.8.1 (filesystem-inferred routing). Cross-refs to §40.9 (Approach A artifact splitter) apply when auth wrapping is involved. The normative text lives at compiler/SPEC.md in the scrml repository.