Skip to main content

new

Create a new blank project. Returns the projectSlug and editorUrl. Add slides with faces slides create + faces slides update. The project is created under the team your API key is scoped to (see Authentication).
Options:
FlagDescription
--name <text>Display name for the new project (default: Untitled)
--api-key <key>API key override
Output:
Examples:

generate

Generate a new interactive presentation from a text prompt. Describe what you want (a pitch, portfolio, guide, or proposal) and Faces handles the content, animations, and layout.
Options:
FlagDescription
--prompt <text>(required) Description of the project to generate
--template <id>Use an existing project as a template
--waitWait for the project to finish generating
--api-key <key>API key override
Output:
Examples:

status

Check the status of a generation job.
Options:
FlagDescription
--waitPoll until the job completes or fails
--api-key <key>API key override
Examples:

list

List your projects.
Options:
FlagDescription
--publishedOnly show published projects
--limit <n>Max results (default: 20, max: 100)
--api-key <key>API key override
Examples:

get

Get details of a specific project.
Examples:

rename

Rename a project. Changes only the display name; the slug and URLs stay the same.
Options:
FlagDescription
--name <text>(required) New display name
--api-key <key>API key override

duplicate

Create a full copy of a project, including all of its slides. The copy gets its own slug and a fresh unpublished URL.
Examples:

publish

Publish a project’s latest version to its live URL.
Examples:

unpublish

Take a published project offline. The project and its slides are kept and can be re-published later.

config get

Read a project’s project.config.json, including its layout settings and shared design tokens (palette and fonts).
Examples:

config update

Merge keys into project.config.json. Use this to define the project’s design tokens. Only the keys you pass are changed; the rest are preserved.
Options:
FlagDescription
--config <json-or-file>(required) A JSON object or a path to a JSON file with the config keys to merge
--api-key <key>API key override
Examples:

url get

Get a project’s current URL configuration plus the subdomains and domains available to switch to.
Examples:

url set

Change the path, switch subdomains, or point the project at a custom domain. Requires a paid plan.
Options:
FlagDescription
--path <p>(required) Path segment after the hostname (use "" for the root)
--subdomain-id <id>Subdomain to host on (from faces url get)
--domain-id <id>Custom domain to host on (from faces url get or faces domains create)
--api-key <key>API key override
Provide exactly one of --subdomain-id or --domain-id. Examples:

subdomains create

Create a custom subdomain for the project’s team, then connect it with faces url set. Requires a paid plan.
Options:
FlagDescription
--subdomain <label>(required) Subdomain label (lowercase letters, numbers, hyphens)
--api-key <key>API key override

domains create

Connect a custom domain and return the DNS records to add. Requires a paid plan.
Options:
FlagDescription
--hostname <host>(required) Domain to connect, without protocol or www (e.g. example.com)
--api-key <key>API key override
Examples:
After DNS propagates, run faces url set <slug> --path <p> --domain-id <id>.

teams list

List the teams your API key can access. The personal team is flagged with isPersonal.
Examples:

slides list

List all slides in a project.
Examples:

slides get

Read a slide’s source files (face.tsx, face.content.json, face.controls.json).
Examples:

slides create

Create a new empty slide. Returns the new slide ID.
Options:
FlagDescription
--name <text>(required) Display name for the new slide
--after <slide-id>Insert after this slide. Omit to append at the end
--editingImmediately show the loading gradient on the new slide. Call slides finish-editing when done
--api-key <key>API key override
Examples:

slides reorder

Reorder every slide in a project to a given order in a single atomic call. The --ids list must contain exactly the project’s existing slide IDs, in the desired final order.
Options:
FlagDescription
--ids <slide-ids>(required) Comma-separated full ordered list of every existing slide ID
--api-key <key>API key override
Examples:

slides update

Update a slide’s source files. Only provided files are changed. The code is validated before saving and returns errors if it doesn’t compile.
Options:
FlagDescription
--tsx <file>Path to face.tsx file (or inline code)
--content <file>Path to face.content.json file (or inline JSON)
--controls <file>Path to face.controls.json file (or inline JSON)
--api-key <key>API key override
Examples:

slides start-editing

Show a loading indicator in the editor while editing a slide. Call before making changes, and always call finish-editing when done.
Options:
FlagDescription
--api-key <key>API key override

slides finish-editing

Clear the loading indicator for a slide. Always call this after editing, even if the edit failed.

slides screenshot

Capture a JPEG screenshot of a slide as it currently renders and return a public CDN URL. Useful for visually verifying a slide after editing it.
Options:
FlagDescription
--mobileCapture the mobile layout instead of desktop
--api-key <key>API key override
Examples:

slides guide

Print the slide authoring reference, the same guide the MCP server and API return. Covers face.tsx structure, face.content.json block types, face.controls.json control types, typography, fonts, CSS, and code examples. Read this before writing slide code for the first time.
Options:
FlagDescription
[slug]Optional project slug; tailors the guide to that project’s mobile canvas size
--api-key <key>API key override
Examples:

Slide file reference

Each slide consists of three files:

face.tsx (React component)

Rules:
  • Must default-export a React component
  • Outer div must have w-full h-full (canvas: 1920×1080 desktop, 384×683 mobile)
  • Use Tailwind CSS and container queries (@sm:, @md:, @lg:, @xl:) instead of media queries
  • Never hardcode text; store all user-visible text in face.content.json
  • Can import any npm package (auto-resolved, no install needed)
  • Available: react, motion/react (Framer Motion), lucide-react, @base-ui/react/*
  • UI components: TextContent from @/components/ui/text-content, Icon from @/components/ui/icon

face.content.json (editable content)

Block types:
  • text: { "type": "text", "content": "HTML string" }, render with <TextContent content={blocks.key.content} />
  • image: { "type": "image", "src": "url | null" }, render with <img src={blocks.key.src} />
  • icon: { "type": "icon", "name": "lucide-icon-name" }, render with <Icon name={blocks.key.name} />
  • table: { "type": "table", "columns": [...], "rows": [...] }, iterate with blocks.key.rows.map(...)

face.controls.json (editor controls)

Control types:
  • slider: { "type": "slider", "min": 0, "max": 100, "step": 1, "value": 50 }
  • switch: { "type": "switch", "value": true }
  • selector: { "type": "selector", "options": ["A", "B"], "value": "A" }
Access in face.tsx: controls.key.value

login

Sign in and store an API key.
Options:
FlagDescription
--team <slug-or-id>Scope the API key to a specific team (default: your personal team)
--api-url <url>API base URL (default: FACES_API_URL or https://faces.app)
Examples:
Opens your browser to authenticate, then saves the key to ~/.config/faces/credentials.json. The --team value can be a team slug or team id (see GET /api/v1/teams). Omit --team to scope the key to your personal team.