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
signupandbookingare 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.