felo-slides — Claude Code skill: what it does, how to install
Generates presentation decks from prompts, PDFs, and local images using the Felo API. Useful when you need a ready-to-share slide link directly from your coding assistant.
npx skills add Felo-Inc/felo-skills --skill felo-slides -a claude-codeWhat felo-slides does
This skill turns text prompts and local documents into finished slide decks. You can supply a local PDF or image to embed the graphic directly on a slide. The agent returns a direct link to the presentation or LiveDoc.
A bundled Node script handles the Felo PPT Task API calls and polls for completion. It does not require jq. The script supports visual themes and can resume interrupted jobs using an existing task identifier.
You must configure the FELO_API_KEY environment variable before running jobs, or execution halts immediately. Slide creation is the sole focus here. For real-time web searches, use felo-search instead.
What it helps with
- generate slide decks from text outlines or prompts
- convert local PDF files and notes into presentations
- embed original local images directly into slides
- retrieve a shareable web link for generated slide decks
- resume timed-out deck generation jobs using a task identifier
Example prompts for the agent
- /felo-slides Create a presentation deck based on the attached project summary
- Generate slides from notes.pdf and include the source diagram image
- /felo-slides resume polling for task TASK_ID
How to install felo-slides
1Skills CLI (Vercel)
npx skills add Felo-Inc/felo-skills --skill felo-slides -a claude-code2Manually: put the files in place
~/.claude/skills/felo-slides/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/felo-slides/
1Skills CLI (Vercel)
npx skills add Felo-Inc/felo-skills --skill felo-slides -a codex2Manually: put the files in place
.agents/skills/felo-slides/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add Felo-Inc/felo-skills --skill felo-slides -a cursor2Manually: put the files in place
.cursor/skills/felo-slides/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install Felo-Inc/felo-skills felo-slides2Manually: put the files in place
.github/skills/felo-slides/SKILL.md1Skills CLI (Vercel)
npx skills add Felo-Inc/felo-skills --skill felo-slides -a gemini-cli2Platform CLI
gemini skills install https://github.com/Felo-Inc/felo-skills --path felo-slidesManually: put the files in place
.devin/skills/felo-slides/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add Felo-Inc/felo-skills --skill felo-slides -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about felo-slides
How do I install felo-slides in Claude Code?
Run npx skills add Felo-Inc/felo-skills --skill felo-slides -a claude-code. This registers the skill in your environment configuration.
What setup is required before using felo-slides?
Generate an API key in your account settings at felo.ai and export it as FELO_API_KEY. If this variable is absent, the script exits immediately with an error.
How do I recover a task that reached the polling timeout?
Resume the task by supplying the original task identifier with --task-id. This checks the status without triggering a duplicate presentation build.
Source text
SKILL.md · MIT
---
name: felo-slides
description: "Generate PPT/slides from prompts, local images, PDFs, and other files with the Felo PPT Task API. Use when users ask to create, make, generate, or export presentations or slide decks; turn an attached/local file into slides; include an original image in a PPT; or explicitly invoke /felo-slides. Handles file upload, API key checks, task creation, polling, and final ppt_url output."
---
# Felo Slides Skill
## When to Use
Trigger this skill for requests about creating presentation files:
- Create/generate slides from a topic or outline
- Turn notes into a PPT deck
- Build slides from a local image, PDF, or document
- Put an uploaded original image into the generated PPT
- Build a presentation with a page count requirement
- Export presentation content into a shareable slide link
Trigger keywords:
- Chinese prompts about making slides or presentations
- English: slides, PPT, presentation deck, generate presentation
- Explicit commands: `/felo-slides`, "use felo slides"
Do NOT use this skill for:
- Real-time information lookup (use `felo-search`)
- Questions about local codebase files
- Pure text tasks that do not require slide generation
## Setup
### 1. Get API key
1. Visit [felo.ai](https://felo.ai)
2. Open Settings -> API Keys
3. Create and copy your API key
### 2. Configure environment variable
Linux/macOS:
```bash
export FELO_API_KEY="your-api-key-here"
```
Windows PowerShell:
```powershell
$env:FELO_API_KEY="your-api-key-here"
```
## How to Execute
Use Bash tool commands and follow this workflow exactly.
### Step 1: Precheck API key
```bash
if [ -z "$FELO_API_KEY" ]; then
echo "ERROR: FELO_API_KEY not set"
exit 1
fi
```
If key is missing, stop and return setup instructions.
### Step 2: Run Node Script (create + poll)
Use the bundled script (no `jq` dependency):
```bash
node felo-slides/scripts/run_ppt_task.mjs \
--query "USER_PROMPT_HERE" \
--interval 10 \
--max-wait 1800 \
--timeout 60
```
When the user provides a local image or file, pass its absolute path with
`--file`. Include the desired use of the original asset in the prompt. For
example:
```bash
node felo-slides/scripts/run_ppt_task.mjs \
--query "Create exactly 2 slides and place the uploaded original image directly in the PPT" \
--file "/absolute/path/to/source.jpg" \
--interval 10 \
--max-wait 1800 \
--timeout 60
```
Do not replace `--file` with a textual description when the user explicitly
wants the original file or image used in the PPT.
To apply a specific theme, first list available themes with `felo ppt-themes`, then pass the theme ID:
```bash
node felo-slides/scripts/run_ppt_task.mjs \
--query "USER_PROMPT_HERE" \
--theme "THEME_ID_HERE" \
--interval 10 \
--max-wait 1800 \
--timeout 60
```
Script behavior:
- Creates task via `POST https://openapi.felo.ai/v2/ppts`
- Supports optional `--file <path>` to upload one local file with `multipart/form-data`
- Supports optional `--theme <id>` to apply a PPT theme (sends `ppt_config.ai_theme_id`)
- Supports optional `--livedoc-id <id>` to reuse an existing LiveDoc instead of auto-creating a new one
- Supports optional `--task-id <id>` to resume polling an existing task (skips creation)
- Polls via `GET https://openapi.felo.ai/v2/tasks/{task_id}/historical`
- Treats `COMPLETED`/`SUCCESS` as success terminal (case-insensitive)
- Treats `FAILED`/`ERROR` as failure terminal
- Stops polling immediately on terminal status
- Prints `ppt_url` on success (fallback: `live_doc_url`)
Optional debug output:
```bash
node felo-slides/scripts/run_ppt_task.mjs \
--query "USER_PROMPT_HERE" \
--interval 10 \
--max-wait 1800 \
--json \
--verbose
```
This outputs structured JSON including:
- `task_id`
- `task_status`
- `ppt_url`
- `live_doc_url`
- `livedoc_short_id`
- `ppt_business_id`
- `error_message`
### Step 3: Confirm terminal status
The script polls the historical endpoint automatically. Wait for it to exit
before responding:
- Success: terminal status is `COMPLETED` or `SUCCESS`, and the script prints
`ppt_url` (fallback: `live_doc_url`)
- Failure: terminal status is `FAILED` or `ERROR`; return the error format below
- Timeout: include the `task_id` and tell the user to resume with `--task-id`
instead of creating a duplicate PPT task
### Step 4: Return structured result
On success, return:
- `ppt_url` immediately (script default output, fallback `live_doc_url`)
- if `--json` is used, also include `task_id`, terminal status, and optional metadata
## Output Format
Use this response structure:
```markdown
## PPT Generation Result
- Task ID: <task_id>
- Status: <status>
- PPT URL: <ppt_url>
- Live Doc URL: <live_doc_url or N/A>
## Notes
- livedoc_short_id: <value or N/A>
- ppt_business_id: <value or N/A>
```
Error format:
```markdown
## PPT Generation Failed
- Error Type: <error code or category>
- Message: <readable message>
- Suggested Action: <next step>
```
## Error Handling
Known API error codes:
- `INVALID_API_KEY` (401): key invalid or revoked
- `PPT_TASK_CREATE_FAILED` (502): create task downstream failed
- `PPT_TASK_QUERY_FAILED` (502): query task downstream failed
Timeout handling:
- If timeout reached, return last known status and instruct user to retry later
- Include `task_id` so user can query again
- **IMPORTANT**: To resume a timed-out task, use `--task-id` instead of `--query` to avoid creating a duplicate PPT:
```bash
node felo-slides/scripts/run_ppt_task.mjs \
--task-id "TASK_ID_HERE" \
--interval 10 \
--max-wait 1800
```
## Important Notes
- Always execute this skill when user intent is slide generation.
- Always return `task_id` so follow-up queries can continue from the same task.
- Do not claim completion without a terminal status.
- Keep API calls minimal: create once, then poll.
## References
- [Felo PPT Task API](https://openapi.felo.ai/docs/api-reference/ppt-tasks)
- [Felo Open Platform](https://openapi.felo.ai/docs/)
© Felo-Inc · MIT · Felo-Inc/felo-skills