---
title: Pages
description: List the site's pages and change their SEO, Open Graph, schema, access and custom code.
---

**Pages** lists the pages of the site. Opening one shows its settings:

| Section | What it sets |
| --- | --- |
| General | Title (also the fallback for search and social), **Publish at** |
| Language | Per-language texts |
| SEO settings | Meta title, description, canonical, noindex |
| Open Graph settings | Share title, description and image |
| Schema markup | JSON-LD for the page |
| Site search settings | Exclude from site search, search title, description and image |
| Access control | Draft: kept out of search engines and the sitemap (no password-protected pages) |
| Custom code | Code added to the page head or body |

## Install

The first time, Gitupcms opens a setup pull request that adds the page settings to the site. On imported sites it adds no packages (the lockfile stays as is) and does not touch your layout's SEO tags: the `gitupcmsSeo()` middleware removes the layout's tags of each kind the CMS writes. The sitemap is wrapped as `sitemap(withGitupcmsFilter(x))`.

## Languages

On `[...locale]` and `[lang]` pages, texts are stored per language under `translations.<lang>`. Images, switches, schema and code are shared by all languages.

## Publish at

A static site still builds a draft page; it is only noindex and left out of the sitemap. **Publish at** adds `.github/workflows/gitupcms-publish.yml`, which runs every 15 minutes and calls your deploy hook (the `GITUPCMS_DEPLOY_HOOK` secret) or re-runs your deploy workflows.

:::note
`.astro` page content is edited in the [AI Editor](/editing/ai-editor), not here.
:::
