A Flask-based presentation web application that generates beautiful, dynamic slideshows from markdown files with frontmatter metadata. Features multiple slide layouts, random image assignment, and smooth keyboard navigation.
- Markdown-Based Content: Write slides in simple markdown with frontmatter metadata
- Multiple Layout Types: 7 different slide layouts (title, content, split, image-bg, image-focus, hero, video)
- Dynamic Image Assignment: Randomly assigns images to slides on each page load
- Video Support: Embed local videos or YouTube/Vimeo URLs
- Keyboard Navigation: Full keyboard controls with arrow keys, spacebar, and more
- Fullscreen Mode: Toggle fullscreen with F key
- Progress Tracking: Visual progress bar and slide counter
- Smooth Animations: CSS-based slide transitions
- Responsive Design: Built with Tailwind CSS for modern, responsive layouts
- Python 3.7+
- pip
- Clone the repository:
git clone <repository-url>
cd powderpaint- Create and activate a virtual environment:
python3 -m venv venv
source venv/bin/activate- Install dependencies:
pip3 install -r requirements.txt# Activate virtual environment (if not already activated)
source venv/bin/activate
# Run the Flask development server
python3 app.pyThe application will be available at http://localhost:5000
- Create markdown files in the
data/folder - Files are sorted alphabetically (e.g.,
slide1.md,slide2.md, etc.) - Each file should have frontmatter metadata and markdown content
---
layout: content
---
## Your Slide Title
Your markdown content here with **bold** and *italic* text.
- Bullet points
- Are supported
- Too!Full-screen title slide with gradient background
---
layout: title
---
# Main Title
## SubtitleStandard content slide with prose styling
---
layout: content
---
## Slide Title
Your content hereTwo-column layout with text on the left and image on the right
---
layout: split
image: /images/your-image.jpg
---
## Split Content
Text appears on the left, image on the rightFull-screen background image with overlay text
---
layout: image-bg
image: /images/background.jpg
---
## Text Over Image
Content appears over the background imageLarge centered image with caption below
---
layout: image-focus
image: /images/focus.jpg
---
## Image Caption
Optional description textExtra large text display (12rem font)
---
layout: hero
---
# BIG TEXTVideo player supporting local files and embedded URLs
---
layout: video
video_url: /videos/your-video.mp4
---
## Video Title
Optional captionFor YouTube/Vimeo:
---
layout: video
video_url: https://www.youtube.com/embed/VIDEO_ID
---- Arrow Keys (←/→): Navigate between slides
- Spacebar: Next slide
- Home: Jump to first slide
- End: Jump to last slide
- F: Toggle fullscreen mode
powderpaint/
├── app.py # Main Flask application
├── requirements.txt # Python dependencies
├── data/ # Markdown slide files
├── images/ # Image assets for slides
├── videos/ # Video files for video slides
├── static/ # Static assets
├── templates/
│ ├── base.html # Base template with Tailwind CSS
│ └── presentation.html # Main presentation template
└── README.md # This file
- Place images in the
images/folder - Images are randomly assigned to slides with image-supporting layouts on each page load
- Supported formats: PNG, JPG, JPEG, GIF, SVG, WEBP
- Override random assignment by specifying
image: /images/filename.extin frontmatter
- Place local video files in the
videos/folder - Supported formats: MP4, WebM, OGG
- Use
video_urlin frontmatter to specify video source - Supports both local files and embedded URLs (YouTube, Vimeo)
GET /- Main presentation viewGET /api/slides- JSON API endpoint returning slide dataGET /images/<filename>- Serve images from images folderGET /videos/<filename>- Serve videos from videos folder
- Backend: Flask 3.0.0
- Markdown Processing: python-frontmatter, markdown2
- Frontend: Tailwind CSS (via CDN)
- JavaScript: Vanilla JS for navigation and fullscreen
The application uses Flask's development server with debug mode enabled by default. The server automatically reloads when code changes are detected.
- Edit
templates/presentation.htmlfor slide rendering logic - Edit
templates/base.htmlfor global styles and scripts
- Define layout in slide frontmatter
- Add rendering logic in
templates/presentation.html - Add corresponding CSS styles in
templates/base.html
This project is open source and available under the MIT License.
Contributions are welcome! Feel free to open pull requests for:
- Bug fixes
- New slide layouts
- Feature enhancements
- Documentation improvements
- Code optimizations
Please ensure your code follows the existing style and structure. All contributions should maintain the modular architecture outlined in the project guidelines.












