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: 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: Output:
Examples:

status

Check the status of a generation job.
Options: Examples:

list

List your projects.
Options: 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:

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: 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: 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:

domains create

Connect a custom domain and return the DNS records to add. Requires a paid plan.
Options: 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: 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: 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: 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:

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