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).
| Flag | Description |
|---|---|
--name <text> | Display name for the new project (default: Untitled) |
--api-key <key> | API key override |
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.
| Flag | Description |
|---|---|
--prompt <text> | (required) Description of the project to generate |
--template <id> | Use an existing project as a template |
--wait | Wait for the project to finish generating |
--api-key <key> | API key override |
status
Check the status of a generation job.
| Flag | Description |
|---|---|
--wait | Poll until the job completes or fails |
--api-key <key> | API key override |
list
List your projects.
| Flag | Description |
|---|---|
--published | Only show published projects |
--limit <n> | Max results (default: 20, max: 100) |
--api-key <key> | API key override |
get
Get details of a specific project.
rename
Rename a project. Changes only the display name; the slug and URLs stay the same.
| Flag | Description |
|---|---|
--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.
publish
Publish a project’s latest version to its live URL.
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).
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.
| Flag | Description |
|---|---|
--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 |
url get
Get a project’s current URL configuration plus the subdomains and domains available to switch to.
url set
Change the path, switch subdomains, or point the project at a custom domain. Requires a paid plan.
| Flag | Description |
|---|---|
--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 |
--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.
| Flag | Description |
|---|---|
--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.
| Flag | Description |
|---|---|
--hostname <host> | (required) Domain to connect, without protocol or www (e.g. example.com) |
--api-key <key> | API key override |
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.
slides list
List all slides in a project.
slides get
Read a slide’s source files (face.tsx, face.content.json, face.controls.json).
slides create
Create a new empty slide. Returns the new slide ID.
| Flag | Description |
|---|---|
--name <text> | (required) Display name for the new slide |
--after <slide-id> | Insert after this slide. Omit to append at the end |
--editing | Immediately show the loading gradient on the new slide. Call slides finish-editing when done |
--api-key <key> | API key override |
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.
| Flag | Description |
|---|---|
--ids <slide-ids> | (required) Comma-separated full ordered list of every existing slide ID |
--api-key <key> | API key override |
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.
| Flag | Description |
|---|---|
--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 |
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.
| Flag | Description |
|---|---|
--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.
| Flag | Description |
|---|---|
--mobile | Capture the mobile layout instead of desktop |
--api-key <key> | API key override |
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.
| Flag | Description |
|---|---|
[slug] | Optional project slug; tailors the guide to that project’s mobile canvas size |
--api-key <key> | API key override |
Slide file reference
Each slide consists of three files:face.tsx (React component)
- 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:
TextContentfrom@/components/ui/text-content,Iconfrom@/components/ui/icon
face.content.json (editable content)
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 withblocks.key.rows.map(...)
face.controls.json (editor controls)
slider:{ "type": "slider", "min": 0, "max": 100, "step": 1, "value": 50 }switch:{ "type": "switch", "value": true }selector:{ "type": "selector", "options": ["A", "B"], "value": "A" }
controls.key.value
login
Sign in and store an API key.
| Flag | Description |
|---|---|
--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) |
~/.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.