AI Presentation Maker Chrome Extension (2026)
AI Presentation Maker Chrome Extension: A Developer Guide
Building a Chrome extension that uses AI to create presentations transforms how developers and content creators generate slides. This guide covers the technical implementation, API integrations, and practical patterns for creating a production-ready AI presentation maker extension.
Core Architecture Overview
An AI presentation maker Chrome extension operates across multiple layers: content scripts for capturing source material, background services for API communication, and a popup or side panel for user interaction. The extension typically works with existing presentation platforms or generates output files directly.
The architecture breaks down into four key components:
- Content Extraction Module - Captures text, images, and structured data from web pages
- AI Processing Pipeline - Sends extracted content to AI APIs for slide generation
- Presentation Builder - Converts AI responses into usable slide formats
- Export/Integration Layer - Outputs to PowerPoint, Google Slides, or PDF
Setting Up Your Extension
Create the manifest file with the necessary permissions:
{
"manifest_version": 3,
"name": "AI Presentation Maker",
"version": "1.0",
"permissions": [
"activeTab",
"scripting",
"storage"
],
"host_permissions": [
"<all_urls>"
],
"action": {
"default_popup": "popup.html",
"default_icon": "icon.png"
}
}
The activeTab permission allows your extension to access the current page content when the user invokes it. The scripting permission enables content script injection for extraction tasks.
Content Extraction Implementation
The content script extracts meaningful content from the active tab. Here’s a practical implementation:
// content-script.js
async function extractPresentationContent() {
// Extract main heading
const title = document.querySelector('h1')?.textContent || '';
// Extract paragraphs and key text content
const paragraphs = Array.from(document.querySelectorAll('p, article p, main p'))
.map(p => p.textContent.trim())
.filter(text => text.length > 50);
// Extract images with alt text
const images = Array.from(document.querySelectorAll('img[src]'))
.filter(img => img.naturalWidth > 200)
.map(img => ({
src: img.src,
alt: img.alt || 'Image',
width: img.naturalWidth
}));
// Extract structured data (lists, tables)
const lists = Array.from(document.querySelectorAll('ul, ol'))
.map(list => Array.from(list.querySelectorAll('li')).map(li => li.textContent));
return {
title,
paragraphs,
images,
lists,
url: window.location.href,
timestamp: new Date().toISOString()
};
}
// Send extracted content to extension
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.action === 'extractContent') {
extractPresentationContent().then(sendResponse);
return true;
}
});
This extraction strategy focuses on high-value content, headings, substantial paragraphs, meaningful images, and structured lists. Adjust selectors based on your target content types.
AI Integration Pattern
Connect your extension to an AI service for generating slide content. The background service handles API communication:
// background.js
const AI_API_ENDPOINT = 'https://api.anthropic.com/v1/messages';
async function generateSlides(content, apiKey) {
const prompt = `Create a presentation outline based on this content.
Title: ${content.title}
Content: ${content.paragraphs.slice(0, 5).join('\n\n')}
Create 5-7 slides with:
- Slide title
- Bullet points (3-5 per slide)
- Suggested image keywords
Respond in JSON format:
[{"title": "Slide Title", "points": ["point 1", "point 2"], "imageKeyword": "keyword"}]`;
const response = await fetch(AI_API_ENDPOINT, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': apiKey,
'anthropic-version': '2023-06-01'
},
body: JSON.stringify({
model: 'claude-3-sonnet-20240229',
max_tokens: 2000,
messages: [{ role: 'user', content: prompt }]
})
});
const data = await response.json();
return JSON.parse(data.content[0].text);
}
This implementation uses Anthropic’s Claude API. You can adapt the pattern for other AI providers by adjusting the endpoint, headers, and request format.
Building the Presentation Output
Convert AI-generated content into downloadable formats. Here’s a PowerPoint-compatible approach:
// presentation-builder.js
function createPresentation(slideData) {
// Create HTML-based presentation for printing/PDF
const html = slideData.map((slide, index) => `
<div class="slide" style="page-break-after: always; padding: 40px;">
<h1 style="font-size: 32px; margin-bottom: 30px;">${slide.title}</h1>
<ul style="font-size: 24px; line-height: 1.8;">
${slide.points.map(point => `<li>${point}</li>`).join('')}
</ul>
${slide.imageKeyword ?
`<p style="margin-top: 40px; color: #666;">[Image: ${slide.imageKeyword}]</p>` :
''}
</div>
`).join('');
return `
<!DOCTYPE html>
<html>
<head>
<title>Presentation</title>
<style>
body { font-family: Arial, sans-serif; margin: 0; }
.slide { width: 100vw; height: 100vh; box-sizing: border-box; }
</style>
</head>
<body>${html}</body>
</html>
`;
}
function downloadPresentation(slideData) {
const html = createPresentation(slideData);
const blob = new Blob([html], { type: 'text/html' });
const url = URL.createObjectURL(blob);
chrome.downloads.download({
url: url,
filename: 'presentation.html'
});
}
Users can open the HTML output in their browser and print to PDF or copy content into their preferred presentation software.
User Interface Design
The popup interface provides essential controls:
<!-- popup.html -->
<!DOCTYPE html>
<html>
<head>
<style>
body { width: 320px; padding: 16px; font-family: system-ui; }
button {
width: 100%; padding: 12px; margin: 8px 0;
background: #2563eb; color: white; border: none;
border-radius: 6px; cursor: pointer;
}
button:hover { background: #1d4ed8; }
button:disabled { background: #9ca3af; }
.status { margin-top: 12px; font-size: 13px; color: #666; }
input { width: 100%; padding: 8px; margin: 8px 0; }
</style>
</head>
<body>
<h3>AI Presentation Maker</h3>
<input type="password" id="apiKey" placeholder="Enter API Key" />
<button id="extractBtn">Extract Content</button>
<button id="generateBtn" disabled>Generate Slides</button>
<button id="downloadBtn" disabled>Download</button>
<div class="status" id="status"></div>
<script src="popup.js"></script>
</body>
</html>
Handling API Keys Securely
Store API keys using Chrome’s secure storage:
// Secure key management
async function saveApiKey(key) {
await chrome.storage.session.set({ apiKey: key });
}
async function getApiKey() {
const result = await chrome.storage.session.get('apiKey');
return result.apiKey;
}
Never store API keys in localStorage or plain files. The session storage provides ephemeral storage that clears when the browser closes.
Performance Considerations
When building production extensions, implement these optimizations:
- Debounce extraction - Wait 300ms after page load before extracting
- Cache AI responses - Store generated slides to avoid redundant API calls
- Limit content size - Truncate long pages to first 10,000 characters
- Handle rate limits - Implement exponential backoff for API failures
Conclusion
An AI presentation maker Chrome extension combines content extraction, AI processing, and presentation generation into a cohesive tool. The implementation patterns shown here, content scripts for extraction, background services for API calls, and HTML-based output, provide a foundation for building production-ready extensions.
Start with basic content extraction, add one AI provider integration, and expand output formats based on user feedback. The core value proposition remains consistent: transforming web content into structured presentations with minimal manual effort.
Try it: Paste your error into our Error Diagnostic for an instant fix.
Related Reading
- AI Flashcard Maker Chrome Extension: Build Your Own Learning Tool
- AI Citation Generator Chrome: A Developer Guide
- AI Color Picker Chrome Extension: A Developer’s Guide
Built by theluckystrike. More at zovo.one
Step-by-Step: Building the AI Presentation Maker
- Set up Manifest V3 with
storage,downloads, andactiveTabpermissions. - Extract content from the current page: when the user clicks “Create Presentation”, extract the page’s headings (h1-h3), key paragraphs, and any data tables. This forms the raw material for the presentation.
- Send to the AI API: pass the extracted content with a prompt asking for a presentation outline with slide titles and bullet points. Specify the number of slides and target audience.
- Generate slide HTML: for each slide in the outline, generate an HTML template with a title, bullet points, and optional speaker notes. Use a clean CSS framework (like simple.css or water.css bundled with the extension) for visual polish.
- Assemble and preview: display the presentation in a new tab using a simple slide viewer that supports keyboard navigation (left/right arrows, F for fullscreen).
- Export to PowerPoint: convert the HTML slides to a PPTX file using the
pptxgenjslibrary bundled with the extension and trigger a download.
Generating Slide Content
async function generatePresentation(pageContent, config) {
const prompt =
'Create a ' + config.slideCount + '-slide presentation for ' + config.audience +
' based on this content:\n\n' + pageContent.slice(0, 3000) +
'\n\nRespond with JSON: {"slides": [{"title": "...", "bullets": ["..."], "notes": "..."}]}';
const response = await callAI(prompt);
return JSON.parse(response);
}
async function buildSlideHTML(slide, template) {
return template
.replace('{{TITLE}}', slide.title)
.replace('{{BULLETS}}', slide.bullets.map(b => '<li>' + b + '</li>').join(''))
.replace('{{NOTES}}', slide.notes || '');
}
Comparison with Presentation Tools
| Tool | AI generation | From web page | Export format | Cost |
|---|---|---|---|---|
| This extension | Yes | Yes | PPTX, HTML | Free (build it) |
| Gamma | Yes | No | PDF, PPTX | Free/Pro |
| Beautiful.ai | No | No | PPTX | $12/mo |
| Canva AI | Yes | Limited | PDF, PPTX | Free/Pro |
| Tome | Yes | No | Free/Pro |
The extension’s advantage is its ability to convert any web page. an article, a Wikipedia page, a research paper. directly into a presentation without copy-pasting.
Advanced: Speaker Notes Generation
After generating slide bullets, ask the AI to write 2-3 sentences of speaker notes for each slide:
async function generateSpeakerNotes(slide) {
const prompt =
'Write 2-3 sentences of speaker notes for this slide:\n' +
'Title: ' + slide.title + '\n' +
'Bullets: ' + slide.bullets.join('; ') +
'\n\nKeep the tone conversational and expand on the bullet points without repeating them.';
return await callAI(prompt);
}
Speaker notes make the exported PPTX immediately usable for live presentations without additional preparation.
Troubleshooting
AI generating too many or too few slides: Add explicit constraints to the prompt. “Exactly 8 slides, no more, no fewer”. If the model still produces the wrong count, post-process the response to trim or pad the slide array to the target count.
pptxgenjs export not working in extension context: pptxgenjs uses FileSaver.js internally, which calls URL.createObjectURL. In a service worker context, this is not available. Run the PPTX generation in the extension popup or an offscreen document where DOM APIs are available.
Slide content too long for the slide template: Limit each bullet to 10 words maximum by adding this to the AI prompt. Long bullets are a common presentation mistake and the AI will respect explicit word-count constraints.
Know your costs → Use our Claude Code Cost Calculator to estimate your monthly spend.