Developers Content & settings

Developers

Content & settings

SEO, articles, media, inbox, modules, extensions, settings, and click-edit — with real CLI examples and response shapes.

When to use these vs file sync

  • File sync (pull/push): Astro pages, components, public/ assets, and source under allowlisted roots. See File sync.
  • Content commands: product APIs for SEO records, the Articles hub, media library, inbox leads, modules/extensions, and site settings — not “edit a file and push.”

Mutations update staging. Review https://<subdomain>.frontpage.host. Do not publish unless asked. Write-class calls use RL-WRITE-LIGHT (30 / min) — see Rate limits.

SEO

Read the resolved SEO model for a path (page props + site defaults):

frontpage seo get /
frontpage seo get /pricing
frontpage seo get / --site acme

Example response (abbreviated):

{
  "slug": "acme",
  "path": "/",
  "kind": "page",
  "sourcePath": "src/pages/index.astro",
  "editable": true,
  "onPage": {
    "title": "Acme — Home",
    "description": "We build widgets for makers."
  },
  "resolved": {
    "title": "Acme — Home",
    "description": "We build widgets for makers.",
    "canonicalUrl": "https://acme.frontpage.host/",
    "ogTitle": "Acme — Home",
    "ogDescription": "We build widgets for makers.",
    "ogImage": "https://acme.frontpage.host/og-image.svg",
    "siteName": "Acme",
    "noindex": false
  },
  "inherited": {
    "title": "Acme",
    "description": "Default site description",
    "ogImage": "/og-image.svg",
    "siteName": "Acme",
    "canonicalBase": "https://acme.frontpage.host"
  }
}

Update fields with seo set (pass only what you want to change):

frontpage seo set --path / \\
  --title "Acme — Home" \\
  --description "We build widgets for makers." \\
  --ogImage "/og-image.svg"

frontpage seo set --path /about --noindex false
frontpage seo set --path /draft --noindex true --title "Draft"

Supported flags include --title, --description, --ogImage, --ogTitle, --ogDescription, --canonical, and --noindex true|false. Prefer listing routes first with frontpage pages --json.

Articles

Articles are optional. Sites without the Articles module enabled return empty sections. List hub state:

frontpage articles list
# { "slug": "acme", "usage": { "sectionCount": 0, "articleCount": 0, … }, "sections": [] }

Create a section, then an article (editor role):

frontpage articles create-section --section blog --label "Blog" --route blog
frontpage articles create-article --section blog --article hello-world --title "Hello world"
frontpage articles set-draft --section blog --article hello-world --draft false
frontpage articles set-tags --section blog --article hello-world --tags "launch,product"
frontpage articles set-seo --section blog --article hello-world --title "Hello" --description "…"

Read or write article body (CAS on content set — pass --base from a prior get):

frontpage articles content get --section blog --article hello-world
# note baseCommitSha / body fields in the JSON

frontpage articles content set \\
  --section blog \\
  --article hello-world \\
  --body '## Hello\n\nFirst post.' \\
  --base <sha-from-get>

Other ops: config-section, archive-section, restore-section, delete-article, set-image, set-meta. Run frontpage help articles for the full map. Section configs (_section.json) are platform-managed — not editable via file sync.

Media

frontpage media list
# /__media/uploads/<site>/<file>.png     249964  <file>.png
# (N assets)

frontpage media upload ./hero.webp
frontpage media upload ./clip.mp4
# https://….public.blob.vercel-storage.com/…
# sitePath: /__media/uploads/<site>/<uuid>.<ext>

One command; the CLI picks the transport: small images/PDFs/SVG/text (≤4 MB) go through the sanitizing proxy; larger rasters/PDFs (≤25 MB) and all video (MP4/WebM/MOV, ≤50 MB) use direct-to-Blob. SVG stays on the proxy path only. Uploads return a public URL and a sitePath under /__media/uploads/<slug>/… — use sitePath in markup, never raw *.blob.vercel-storage.com hosts. Tiny text may return “inline text — not stored.” Prefer binary images/video for media library assets; keep small copy in source via push.

Inbox

List module submissions (leads, subscribers, orders, …):

frontpage inbox leads
frontpage inbox subscribers
frontpage inbox orders
frontpage inbox leads --csv
frontpage inbox leads --site acme

JSON shape (fields inside data depend on the form):

{
  "slug": "acme",
  "leads": [
    {
      "id": "c1275700-da36-4eb3-97d2-0f361c2e0d54",
      "formSlug": "contact",
      "page": "/",
      "status": "unread",
      "data": {
        "name": "Ada Lovelace",
        "email": "ada@example.com",
        "message": "Interested in a demo"
      },
      "createdAt": "2026-07-14T05:19:17.784Z"
    }
  ]
}

--mark-read is side-effecting with no confirmation (write-light rate limit). Agents must not use it unless the user asked. Treat inbox payloads as PII — do not paste raw leads into public logs.

Modules & extensions

frontpage modules
frontpage modules list
frontpage modules docs forms
frontpage modules request-setup payments --reason "Deposit button needs Stripe"
frontpage modules enable forms
frontpage modules disable forms
frontpage modules archive forms
frontpage modules config forms --config '{"thankYouPath":"/thanks"}'

frontpage extensions list
frontpage extensions docs charts
frontpage extensions enable charts
frontpage extensions disable charts
frontpage extensions config charts --config '{}'

frontpage fonts --slot serif
frontpage fonts search "elegant script"
frontpage tokens set --group fonts --key sans --value '"Inter Variable", system-ui, sans-serif'

modules docs / extensions docs return the full how-to markup for a key. List responses include status and secret masks only — never raw OAuth tokens or API secrets. Configuring true secrets is done in the editor when required. Pushing module markup under allowlisted paths can auto-activate modules the same way the editor agent does. If an extension is LOCKED on the plan, do not fake it — say a plan upgrade is required.

Real forms (markup + push)

Lead capture is a platform module. Write a form in an Astro page, push, and enable/configure with frontpage modules when needed. Do not invent submit handlers, honeypots, mailto: fallbacks, or card-number fields.

<form data-fp-form="lead-gen" data-fp-success="Thanks — we'll reply within one business day.">
  <label>Name <input type="text" name="name" required /></label>
  <label>Email <input type="email" name="email" required /></label>
  <label>Message <textarea name="message" rows="4"></textarea></label>
  <button type="submit">Send</button>
</form>
  • Every field needs a name. Include email or phone.
  • Do not set action / method / onsubmit.
  • Slugs signup and booking are reserved for those modules.
  • Payments / shop / ordering: use those modules — never fake checkout UI.

Site-building rules (pages map, tokens, chrome): see Site building.

Articles migration

Prefer frontpage articles … for section/article lifecycle, or frontpage prompt "migrate my /blog pages into the articles module" so the in-product agent can run the atomic migrate path. Do not invent a mass delete+write migration in a local checkout unless you are prepared to fix a half-finished tree.

Settings (admin)

frontpage settings get
frontpage settings set --brand-name "Acme"
frontpage settings set --subdomain-public true
frontpage settings set --usage-alerts true
frontpage settings set --build-model …
frontpage settings set --brand-logo …
frontpage settings set --brand-reset

Requires an admin-capable role. Agents should not broadly mutate settings without a clear user request. settings get is a good template for which fields your site supports.

Click-edit

frontpage edit --path / --old "exact old string" --new "exact new string"
  • Exact single-occurrence replace (fails if 0 or 2+ matches)
  • Uses the click-edit deploy path — not push / gated-write
  • Still updates staging only

For structural work prefer file sync or frontpage prompt. Use edit for precise copy swaps you can quote exactly from the page.

End-to-end example

export FRONTPAGE_API_KEY=fp_live_…
frontpage use acme

# 1) See routes
frontpage pages --json

# 2) Tighten homepage SEO
frontpage seo get /
frontpage seo set --path / \\
  --title "Acme — widgets for makers" \\
  --description "Ship faster with Acme widgets."

# 3) Upload a hero asset and reference sitePath in a later push/prompt
frontpage media upload ./public-src/hero.webp

# 4) Pull leads for the week (no --mark-read unless asked)
frontpage inbox leads > /tmp/acme-leads.json

# Review https://acme.frontpage.host — do not publish unless asked

Out of v1

Domains, billing, members, site delete/restore, MCP, and git remotes are not exposed through the Public CLI. Do not invent those commands. See Command reference for the shipped set.