{"id":"8282f50d-f7d1-4120-8e47-cd8bebc12f8f","shortId":"a9d2nw","kind":"skill","title":"presenton","tagline":"Generate AI-powered presentations locally using Presenton. Use when: (1) User asks to create a presentation or slideshow, (2) User wants to convert a document or prompt into slides, (3) User needs PPTX/PDF export with AI-generated content.","description":"# Presenton — AI Presentation Generator\n\nPresenton is an open-source, locally-run AI presentation generator. It creates professional slideshows from text prompts or uploaded documents, exports to PPTX and PDF, and exposes a built-in MCP server so agents can generate presentations programmatically.\n\n## When to use\n\n- Use case 1: When the user asks to generate a presentation or slideshow on any topic\n- Use case 2: When you need to convert a document, report, or prompt into structured slides\n- Use case 3: When the user wants to export a presentation as PPTX or PDF\n- Use case 4: When building agent workflows that produce presentation outputs via MCP\n- Use case 5: When the user wants AI-generated presentations that run entirely on their own device\n\n## Required tools / APIs\n\n- Docker (recommended) or Node.js LTS + Python 3.11 + uv for local dev\n- One of: OpenAI API key, Google Gemini API key, Anthropic API key, or a local Ollama instance\n- Optional image providers: DALL-E 3, Gemini Flash, Pexels, Pixabay, or ComfyUI\n\nInstall options:\n\n```bash\n# Docker (Linux/macOS) — recommended\ndocker run -it --name presenton \\\n  -p 5000:80 \\\n  -v \"./app_data:/app_data\" \\\n  ghcr.io/presenton/presenton:latest\n\n# Docker (Windows PowerShell)\ndocker run -it --name presenton `\n  -p 5000:80 `\n  -v \"${PWD}\\app_data:/app_data\" `\n  ghcr.io/presenton/presenton:latest\n\n# With OpenAI + DALL-E 3 (no UI key entry needed)\ndocker run -it --name presenton \\\n  -p 5000:80 \\\n  -e LLM=\"openai\" \\\n  -e OPENAI_API_KEY=\"<your-key>\" \\\n  -e IMAGE_PROVIDER=\"dall-e-3\" \\\n  -e CAN_CHANGE_KEYS=\"false\" \\\n  -v \"./app_data:/app_data\" \\\n  ghcr.io/presenton/presenton:latest\n```\n\n## Skills\n\n### generate_presentation_via_api\n\nGenerate a presentation by sending a prompt to the Presenton REST API.\n\n```bash\n# Start Presenton first (see install above), then call the API\ncurl -fsS --max-time 60 \\\n  -X POST \"http://localhost:5000/api/v1/ppt/generate\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\": \"Introduction to Quantum Computing\", \"n_slides\": 8}'\n\n# The response includes a presentation ID; download PPTX with:\nPPTX_PATH=$(curl -s \"http://localhost:5000/api/v1/ppt/generate\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\": \"Introduction to Quantum Computing\", \"n_slides\": 8}' \\\n  | jq -r '.pptx_url')\ncurl -s \"http://localhost:5000${PPTX_PATH}\" -o presentation.pptx\n```\n\n**Node.js:**\n\n```javascript\nasync function generatePresentation(prompt, nSlides = 8, baseUrl = 'http://localhost:5000') {\n  const res = await fetch(`${baseUrl}/api/v1/ppt/generate`, {\n    method: 'POST',\n    headers: { 'Content-Type': 'application/json' },\n    body: JSON.stringify({ prompt, n_slides: nSlides }),\n  });\n  if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);\n  return await res.json(); // contains pptx_url and pdf_url\n}\n\n// Usage\n// generatePresentation('Introduction to Quantum Computing', 10).then(console.log);\n```\n\n### generate_with_mcp\n\nUse Presenton's built-in MCP server to generate presentations from an AI agent.\n\n```bash\n# Add Presenton MCP server to your agent config (e.g. Claude Desktop, Cursor)\n# mcp.json entry:\ncat <<'EOF'\n{\n  \"mcpServers\": {\n    \"presenton\": {\n      \"url\": \"http://localhost:5000/mcp\"\n    }\n  }\n}\nEOF\n```\n\n**Node.js:**\n\n```javascript\n// The MCP server exposes a generate_presentation tool.\n// Call it via your MCP client library:\nconst result = await mcpClient.callTool('presenton', 'generate_presentation', {\n  prompt: 'Climate Change: Causes and Solutions',\n  n_slides: 10,\n});\nconsole.log(result); // { pptx_url, pdf_url }\n```\n\n### generate_with_custom_template\n\nUpload an existing PPTX to create an on-brand template, then generate from it.\n\n```bash\n# Upload a template PPTX to extract theme/design\ncurl -fsS --max-time 30 \\\n  -X POST \"http://localhost:5000/api/v1/ppt/upload-template\" \\\n  -F \"file=@my_template.pptx\"\n\n# Generate a new presentation using that template\ncurl -fsS --max-time 60 \\\n  -X POST \"http://localhost:5000/api/v1/ppt/generate\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"prompt\": \"Q3 Sales Report\", \"n_slides\": 6, \"template\": \"my_template\"}'\n```\n\n**Node.js:**\n\n```javascript\nconst { readFileSync } = require('fs');\n\nasync function uploadTemplate(filePath, baseUrl = 'http://localhost:5000') {\n  const form = new FormData();\n  form.append('file', new Blob([readFileSync(filePath)]), 'template.pptx');\n  const res = await fetch(`${baseUrl}/api/v1/ppt/upload-template`, {\n    method: 'POST',\n    body: form,\n  });\n  if (!res.ok) throw new Error(`Upload failed: HTTP ${res.status}`);\n  return await res.json();\n}\n\n// Usage\n// uploadTemplate('./branding.pptx').then(console.log);\n```\n\n## Output format\n\n- `pptx_url`: Path to download the generated PPTX file (string)\n- `pdf_url`: Path to download the generated PDF file (string)\n- Error shape: `{ detail: \"<message>\" }` — check Presenton logs for root cause\n\n## Rate limits / Best practices\n\n- Generation takes 15–60 seconds depending on the model and number of slides; use async handling\n- Cache generated presentations by prompt hash to avoid redundant API calls\n- Use `DISABLE_IMAGE_GENERATION=true` for faster, text-only output during development\n- Prefer Pexels or Pixabay as image providers to avoid per-image AI costs\n- Set `CAN_CHANGE_KEYS=false` in production to lock down credentials\n\n## Agent prompt\n\n```text\nYou have Presenton capability. When a user asks to create a presentation:\n\n1. Confirm the topic and desired number of slides (default: 8)\n2. Call POST http://localhost:5000/api/v1/ppt/generate with {\"prompt\": \"<topic>\", \"n_slides\": <n>}\n3. Wait for the response (up to 60 seconds) and extract pptx_url and pdf_url\n4. Offer the user download links for both PPTX and PDF\n5. If a custom template is requested, upload it first via /api/v1/ppt/upload-template and include the template name in the generate request\n\nAlways check that Presenton is running at http://localhost:5000 before calling the API.\nReport any HTTP errors with the status code and response body so the user can diagnose the issue.\n```\n\n## Troubleshooting\n\n**Presenton container not starting:**\n- Symptom: `docker run` exits immediately or port 5000 is unreachable\n- Solution: Check `docker logs presenton` for errors; ensure port 5000 is free (`lsof -i :5000`)\n\n**Generation times out:**\n- Symptom: API call hangs beyond 60 seconds\n- Solution: Verify the LLM API key is valid and the model is reachable; reduce `n_slides`; check container logs\n\n**No images in slides:**\n- Symptom: Slides are generated but contain no images\n- Solution: Set `IMAGE_PROVIDER` and the matching API key environment variable; or set `DISABLE_IMAGE_GENERATION=true` to skip images\n\n**MCP server not responding:**\n- Symptom: Agent cannot connect to `http://localhost:5000/mcp`\n- Solution: Confirm Presenton is running and the MCP endpoint is accessible; check firewall rules\n\n## See also\n\n- [../browser-automation-agent/SKILL.md](../browser-automation-agent/SKILL.md) — Automate the Presenton web UI when API access is not available\n- [../pdf-manipulation/SKILL.md](../pdf-manipulation/SKILL.md) — Post-process exported PDFs\n- [../static-assets-hosting/SKILL.md](../static-assets-hosting/SKILL.md) — Host generated presentations for sharing\n\n---\n\n## Notes\n\n- Source: https://github.com/presenton/presenton\n- License: Apache 2.0\n- Skill file path: `skills/presenton/SKILL.md`","tags":["presenton","open","skills","besoeasy","agent-skills","ai-agents","claude-code","clawdbot","clawdbot-skill","llm-tools","mcp-server","openai"],"capabilities":["skill","source-besoeasy","skill-presenton","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-clawdbot","topic-clawdbot-skill","topic-llm-tools","topic-mcp-server","topic-openai","topic-openclaw","topic-vibe-coding","topic-vibecoding"],"categories":["open-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/besoeasy/open-skills/presenton","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add besoeasy/open-skills","source_repo":"https://github.com/besoeasy/open-skills","install_from":"skills.sh"}},"qualityScore":"0.505","qualityRationale":"deterministic score 0.51 from registry signals: · indexed on github topic:agent-skills · 111 github stars · SKILL.md body (7,348 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-02T12:55:04.497Z","embedding":null,"createdAt":"2026-04-18T22:10:51.868Z","updatedAt":"2026-05-02T12:55:04.497Z","lastSeenAt":"2026-05-02T12:55:04.497Z","tsv":"'/api/v1/ppt/generate':404 '/api/v1/ppt/upload-template':627,822 '/app_data':227,228,247,290,291 '/branding.pptx':646 '/browser-automation-agent/skill.md':981,982 '/pdf-manipulation/skill.md':994,995 '/presenton/presenton':1012 '/presenton/presenton:latest':231,250,294 '/static-assets-hosting/skill.md':1001,1002 '1':12,92,764 '10':442,518 '15':686 '2':21,108,775 '2.0':1015 '3':32,124,205,256,283,784 '3.11':177 '30':557 '4':139,800 '5':152,811 '5000':224,241,268,383,398,610,840,875,887,892 '5000/api/v1/ppt/generate':332,361,581,779 '5000/api/v1/ppt/upload-template':561 '5000/mcp':484,964 '6':594 '60':328,577,687,791,901 '8':346,375,395,774 '80':225,242,269 'access':975,990 'add':464 'agent':82,142,462,470,749,959 'ai':4,39,43,55,158,461,736 'ai-gener':38,157 'ai-pow':3 'also':980 'alway':832 'anthrop':191 'apach':1014 'api':170,185,189,192,275,299,311,322,709,844,897,907,941,989 'app':245 'application/json':337,366,411,586 'ask':14,96,759 'async':390,604,698 'autom':983 'avail':993 'avoid':707,732 'await':401,425,428,505,624,642 'baseurl':396,403,608,626 'bash':214,312,463,544 'best':682 'beyond':900 'blob':618 'bodi':412,630,855 'brand':538 'build':141 'built':77,452 'built-in':76,451 'cach':700 'call':320,496,710,776,842,898 'cannot':960 'capabl':755 'case':91,107,123,138,151 'cat':478 'caus':513,679 'chang':286,512,740 'check':674,833,879,919,976 'claud':473 'client':501 'climat':511 'code':852 'comfyui':211 'comput':343,372,441 'config':471 'confirm':765,966 'connect':961 'console.log':444,519,648 'const':399,503,600,611,622 'contain':430,865,920,931 'content':41,335,364,409,584 'content-typ':334,363,408,583 'convert':25,113 'cost':737 'creat':16,59,534,761 'credenti':748 'curl':323,358,380,552,572 'cursor':475 'custom':527,814 'd':338,367,587 'dall':203,254,281 'dall-':202,253,280 'data':246 'default':773 'depend':689 'desir':769 'desktop':474 'detail':673 'dev':181 'develop':723 'devic':167 'diagnos':860 'disabl':712,947 'docker':171,215,218,232,235,262,869,880 'document':27,67,115 'download':353,655,665,804 'e':204,255,270,273,277,282,284 'e.g':472 'endpoint':973 'ensur':885 'entir':163 'entri':260,477 'environ':943 'eof':479,485 'error':422,636,671,848,884 'exist':531 'exit':871 'export':36,68,130,999 'expos':74,491 'extract':550,794 'f':562 'fail':638 'fals':288,742 'faster':717 'fetch':402,625 'file':563,616,659,669,1017 'filepath':607,620 'firewal':977 'first':315,820 'flash':207 'form':612,631 'form.append':615 'format':650 'formdata':614 'free':889 'fs':603 'fss':324,553,573 'function':391,605 'gemini':188,206 'generat':2,40,45,57,84,98,159,296,300,445,457,493,508,525,541,565,657,667,684,701,714,830,893,929,949,1004 'generatepresent':392,437 'ghcr.io':230,249,293 'ghcr.io/presenton/presenton:latest':229,248,292 'github.com':1011 'github.com/presenton/presenton':1010 'googl':187 'h':333,362,582 'handl':699 'hang':899 'hash':705 'header':407 'host':1003 'http':423,639,847 'id':352 'imag':200,278,713,729,735,923,933,936,948,953 'immedi':872 'includ':349,824 'instal':212,317 'instanc':198 'introduct':340,369,438 'issu':862 'javascript':389,487,599 'jq':376 'json.stringify':413 'key':186,190,193,259,276,287,741,908,942 'librari':502 'licens':1013 'limit':681 'link':805 'linux/macos':216 'llm':271,906 'local':7,53,180,196 'localhost':331,360,382,397,483,560,580,609,778,839,963 'locally-run':52 'lock':746 'log':676,881,921 'lsof':890 'lts':175 'match':940 'max':326,555,575 'max-tim':325,554,574 'mcp':79,149,447,454,466,489,500,954,972 'mcp.json':476 'mcpclient.calltool':506 'mcpserver':480 'method':405,628 'model':692,913 'my_template.pptx':564 'n':344,373,415,516,592,782,917 'name':221,238,265,827 'need':34,111,261 'new':421,567,613,617,635 'node.js':174,388,486,598 'note':1008 'nslide':394,417 'number':694,770 'o':386 'offer':801 'ollama':197 'on-brand':536 'one':182 'open':50 'open-sourc':49 'openai':184,252,272,274 'option':199,213 'output':147,649,721 'p':223,240,267 'path':357,385,653,663,1018 'pdf':72,136,434,523,661,668,798,810 'pdfs':1000 'per':734 'per-imag':733 'pexel':208,725 'pixabay':209,727 'port':874,886 'post':330,406,559,579,629,777,997 'post-process':996 'power':5 'powershel':234 'pptx':70,134,354,356,378,384,431,521,532,548,651,658,795,808 'pptx/pdf':35 'practic':683 'prefer':724 'present':6,18,44,56,85,100,132,146,160,297,302,351,458,494,509,568,702,763,1005 'presentation.pptx':387 'presenton':1,9,42,46,222,239,266,309,314,449,465,481,507,675,754,835,864,882,967,985 'process':998 'produc':145 'product':744 'profession':60 'programmat':86 'prompt':29,64,118,306,339,368,393,414,510,588,704,750,781 'provid':201,279,730,937 'pwd':244 'python':176 'q3':589 'quantum':342,371,440 'r':377 'rate':680 'reachabl':915 'readfilesync':601,619 'recommend':172,217 'reduc':916 'redund':708 'report':116,591,845 'request':817,831 'requir':168,602 'res':400,623 'res.json':429,643 'res.ok':419,633 'res.status':424,640 'res.text':426 'respond':957 'respons':348,788,854 'rest':310 'result':504,520 'return':427,641 'root':678 'rule':978 'run':54,162,219,236,263,837,870,969 'sale':590 'second':688,792,902 'see':316,979 'send':304 'server':80,455,467,490,955 'set':738,935,946 'shape':672 'share':1007 'skill':295,1016 'skill-presenton' 'skills/presenton/skill.md':1019 'skip':952 'slide':31,121,345,374,416,517,593,696,772,783,918,925,927 'slideshow':20,61,102 'solut':515,878,903,934,965 'sourc':51,1009 'source-besoeasy' 'start':313,867 'status':851 'string':660,670 'structur':120 'symptom':868,896,926,958 'take':685 'templat':528,539,547,571,595,597,815,826 'template.pptx':621 'text':63,719,751 'text-on':718 'theme/design':551 'throw':420,634 'time':327,556,576,894 'tool':169,495 'topic':105,767 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-clawdbot' 'topic-clawdbot-skill' 'topic-llm-tools' 'topic-mcp-server' 'topic-openai' 'topic-openclaw' 'topic-vibe-coding' 'topic-vibecoding' 'troubleshoot':863 'true':715,950 'type':336,365,410,585 'ui':258,987 'unreach':877 'upload':66,529,545,637,818 'uploadtempl':606,645 'url':379,432,435,482,522,524,652,662,796,799 'usag':436,644 'use':8,10,89,90,106,122,137,150,448,569,697,711 'user':13,22,33,95,127,155,758,803,858 'uv':178 'v':226,243,289 'valid':910 'variabl':944 'verifi':904 'via':148,298,498,821 'wait':785 'want':23,128,156 'web':986 'window':233 'workflow':143 'x':329,558,578","prices":[{"id":"5a90ae43-2e94-4975-beeb-3a121f3bbb84","listingId":"8282f50d-f7d1-4120-8e47-cd8bebc12f8f","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"besoeasy","category":"open-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:10:51.868Z"}],"sources":[{"listingId":"8282f50d-f7d1-4120-8e47-cd8bebc12f8f","source":"github","sourceId":"besoeasy/open-skills/presenton","sourceUrl":"https://github.com/besoeasy/open-skills/tree/main/skills/presenton","isPrimary":false,"firstSeenAt":"2026-04-18T22:10:51.868Z","lastSeenAt":"2026-05-02T12:55:04.497Z"}],"details":{"listingId":"8282f50d-f7d1-4120-8e47-cd8bebc12f8f","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"besoeasy","slug":"presenton","github":{"repo":"besoeasy/open-skills","stars":111,"topics":["agent-skills","ai","ai-agents","claude-code","clawdbot","clawdbot-skill","llm-tools","mcp-server","openai","openclaw","vibe-coding","vibecoding"],"license":null,"html_url":"https://github.com/besoeasy/open-skills","pushed_at":"2026-03-31T13:05:30Z","description":"Battle-tested skill library for AI agents. Save 98% of API costs with ready-to-use code for crypto, PDFs, search, web scraping & more. No trial-and-error, no expensive APIs.","skill_md_sha":"bbecdeceb6232086dd243326e4210da001211c6a","skill_md_path":"skills/presenton/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/besoeasy/open-skills/tree/main/skills/presenton"},"layout":"multi","source":"github","category":"open-skills","frontmatter":{"name":"presenton","description":"Generate AI-powered presentations locally using Presenton. Use when: (1) User asks to create a presentation or slideshow, (2) User wants to convert a document or prompt into slides, (3) User needs PPTX/PDF export with AI-generated content."},"skills_sh_url":"https://skills.sh/besoeasy/open-skills/presenton"},"updatedAt":"2026-05-02T12:55:04.497Z"}}