OpenMAIC Export Formats: PowerPoint, HTML, ZIP, and MP4 Explained
OpenMAIC supports four self-contained export formats—PowerPoint (.pptx), Interactive HTML (.html), Classroom ZIP (.maic.zip), and MP4 video—enabling offline sharing, backups, and cross-platform publishing of generated classrooms.
The THU-MAIC/OpenMAIC repository provides a comprehensive export subsystem that allows educators and developers to extract generated classroom content into portable, distributable formats. Understanding what export formats are supported by OpenMAIC is essential for integrating course materials into existing workflows or deploying them in offline environments.
PowerPoint (.pptx) Export
OpenMAIC generates fully editable PowerPoint decks that preserve all visual elements from the classroom session. The export includes images, charts, LaTeX formulas, and any embedded media, making it suitable for traditional presentation workflows.
The PPTX generation logic is implemented in [app/api/export/pptx.ts](https://github.com/THU-MAIC/OpenMAIC/blob/main/app/api/export/pptx.ts) and relies on the @openmaic/pptxgenjs package to construct the slide deck programmatically.
Interactive HTML (.html) Export
The Interactive HTML export produces a single, self-contained .html file that preserves all interactive elements from the classroom. This includes embedded simulations, quizzes, Three.js scenes, KaTeX rendering, Tailwind CSS styling, and Google Fonts.
According to the source code in [app/api/export/html.ts](https://github.com/THU-MAIC/OpenMAIC/blob/main/app/api/export/html.ts), OpenMAIC achieves true offline capability by inlining external assets as data: URIs. The system processes assets through the contract defined in packages/@openmaic/storage/docs/asset-http-contract.md, converting fonts, images, and Three.js addons into base64-encoded data URLs. Assets that cannot be retrieved due to CORS restrictions remain as external URLs, and the system reports these exceptions to the user.
Classroom ZIP (.maic.zip) Export
The Classroom ZIP format packages the entire course structure—including stages, scenes, and assets—into a single .maic.zip archive. This format serves dual purposes: as a complete backup mechanism and as a migration tool for importing classrooms into other OpenMAIC instances.
The archive contains a manifest.json file that describes the course structure and relative asset paths. The bundling logic resides in [app/api/export/zip.ts](https://github.com/THU-MAIC/OpenMAIC/blob/main/app/api/export/zip.ts), which follows the runtime HTTP contract documented in packages/@openmaic/storage/docs/runtime-http-contract.md.
MP4 Video (.mp4) Export
For video distribution, OpenMAIC can render the entire classroom as an MP4 file. This export requires the optional render-service container, which orchestrates Chromium and FFmpeg to capture and encode the video stream.
The implementation in [app/api/export-video/render.ts](https://github.com/THU-MAIC/OpenMAIC/blob/main/app/api/export-video/render.ts) handles the rendering pipeline. Because this process executes server-side with significant resource requirements, it operates as a separate service profile that must be explicitly enabled in the deployment configuration.
Programmatic Export via the OpenMAIC API
Each export format is accessible through RESTful endpoints under the /api namespace. The client-side interface ultimately invokes these endpoints via standard HTTP POST requests.
Export to PowerPoint
await fetch('/api/export/pptx', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ courseId: currentCourse.id })
})
.then(r => r.blob())
.then(blob => {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `${currentCourse.title}.pptx`;
a.click();
URL.revokeObjectURL(url);
});
Export to Interactive HTML
await fetch('/api/export/html', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ courseId: currentCourse.id })
})
.then(r => r.blob())
.then(blob => {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `${currentCourse.title}.html`;
a.click();
URL.revokeObjectURL(url);
});
Export to Classroom ZIP
await fetch('/api/export/zip', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ courseId: currentCourse.id })
})
.then(r => r.blob())
.then(blob => {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `${currentCourse.title}.maic.zip`;
a.click();
URL.revokeObjectURL(url);
});
Export to MP4 Video
await fetch('/api/export-video/render', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ courseId: currentCourse.id })
})
.then(r => r.blob())
.then(blob => {
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = `${currentCourse.title}.mp4`;
a.click();
URL.revokeObjectURL(url);
});
Summary
- PowerPoint (.pptx): Fully editable slides generated via
@openmaic/pptxgenjsinapp/api/export/pptx.ts. - Interactive HTML (.html): Self-contained offline web pages with inlined
data:URIs, implemented inapp/api/export/html.ts. - Classroom ZIP (.maic.zip): Portable archives containing course structure and
manifest.json, handled byapp/api/export/zip.ts. - MP4 Video (.mp4): Server-side rendered video requiring the optional render-service container running Chromium and FFmpeg.
Frequently Asked Questions
Does the Interactive HTML export work completely offline?
Yes. OpenMAIC inlines external assets—including Google Fonts, images, and Three.js addons—as base64-encoded data: URIs during HTML generation. Only assets blocked by CORS restrictions remain as external URLs, and the system alerts you to these exceptions.
What infrastructure is required for MP4 video export?
MP4 export requires deploying the optional render-service container, which is not enabled by default. This container bundles Chromium for headless rendering and FFmpeg for video encoding, consuming significant server resources during the capture process.
Can I import a Classroom ZIP into a different OpenMAIC instance?
Yes. The .maic.zip format is designed for cross-instance portability. The archive contains a manifest.json file that describes the course structure, allowing you to restore or migrate classrooms between separate OpenMAIC deployments.
Are PowerPoint exports editable after download?
Yes. The PPTX files generated by OpenMAIC are fully editable PowerPoint presentations. They preserve vector graphics, text layers, and LaTeX-rendered formulas as native PowerPoint objects rather than flattened images.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →