A full-featured web-based slide editor with OCR text editing, AI-powered logo removal, shape tools, image filters, video processing, templates, version history, and more.
SlideCraft is a web-based PowerPoint slide editor built for editing image-based presentations (like those generated by NotebookLM, Gamma, or similar AI tools). It lets you:
- Edit text directly on slide images using EasyOCR detection
- Remove NotebookLM watermarks from slides and videos seamlessly
- Draw shapes, freehand, add images with a full creative toolkit
- Apply image filters — brightness, contrast, blur, grayscale, sepia
- Manage versions and templates — save, restore, reuse
- Process videos — remove logos with real-time progress and stop control
- Export as PPTX, PDF, PNG ZIP, or animated GIF
Built with Flask + vanilla JS. No React, no build step. Just python app.py and go.
Upload your PPTX, edit text with OCR, remove logos, export clean slides.
| Feature | Description |
|---|---|
| Text Overlays | Styled text boxes with full typography controls |
| Rectangle | Colored rectangles with fill and opacity |
| Circle / Ellipse | Draw circles and ellipses |
| Line / Arrow | Draw lines with arrowheads |
| Callout | Speech bubble callout shapes |
| Freehand Drawing | Pen tool — draw anything with mouse |
| Cover & Type | Draw over text to cover + replace it |
| Image Overlays | Upload and place images on slides |
| Feature | Description |
|---|---|
| EasyOCR Detection | One-click text detection — no external binaries needed |
| Click to Edit | Click any detected text region to replace it |
| Auto Color Match | Samples background + text color from the original image |
| Auto Font Weight | Detects normal/semibold/bold/extrabold via ink density analysis |
| Auto-Fit Text | Text auto-shrinks to fit within the bounding box |
| Inline Editing | Double-click any text to edit directly on the canvas |
| Apply / Bake | Burns all edits permanently into the slide image |
| Feature | Description |
|---|---|
| Font Family | 12 system fonts: Arial, Segoe UI, Calibri, Verdana, Georgia, Tahoma, etc. |
| Font Size | 8-72pt with precise numeric control |
| Bold / Italic / Underline | Full text style controls |
| Text Alignment | Left, center, right |
| Letter Spacing | -5 to 20px tracking adjustment |
| Line Height | 0.8x to 3x multiplier |
| Text Transform | None, UPPERCASE, lowercase, Title Case |
| Text Shadow | Drop shadow with custom color picker |
| Text Outline | Stroke outline with custom color |
| Bullet / Numbered Lists | Toggle list formatting |
| Filter | Description |
|---|---|
| Brightness +/- | Adjust slide brightness |
| Contrast +/- | Adjust slide contrast |
| Saturation +/- | Adjust color saturation |
| Blur | Gaussian blur effect |
| Sharpen | Sharpen details |
| Grayscale | Convert to black & white |
| Sepia | Vintage warm tone |
| Reset | Revert to original |
| Feature | Description |
|---|---|
| One-Click Logo Removal | "Remove Logo" strips NotebookLM watermark from all slides |
| Auto Watermark Detection | Scans slide corners for watermarks/logos using edge analysis |
| Remove from Single Slide | Remove detected watermark from current slide only |
| Remove from All Slides | Remove detected watermark across all slides at once |
| Confirmation Dialog | Delete confirmation before any destructive watermark removal |
| OpenCV Inpainting | Telea algorithm — samples from all surrounding edges seamlessly |
| Feature | Description |
|---|---|
| Text Watermark | Add text like "CONFIDENTIAL", "DRAFT", custom text |
| Image Watermark | Upload a logo/image as watermark overlay |
| Position Control | Center, Top-Left, Top-Right, Bottom-Left, Bottom-Right, Tiled |
| Opacity Control | 5% to 80% transparency |
| Scale Control | Image watermark size as % of slide width |
| Apply to All | Watermark applied to every slide at once |
| Feature | Description |
|---|---|
| Any Format | MP4, MOV, AVI, MKV and more |
| Any Length | Handles 3-8+ minute videos |
| Visual Region Select | Drag a resizable box over the logo on a preview frame |
| OpenCV Inpainting | Same seamless per-frame removal as slides |
| Audio Preserved | Audio track muxed back via MoviePy |
| Real-Time Progress | Live frame count, percentage, ETA, and elapsed time |
| Stop Button | Cancel processing mid-way — cleans up temp files |
| Auto Logo Detection | Automatic corner analysis to suggest logo position |
| Replace Logo | Swap the logo with your own image instead of removing |
| Video Trimming | Cut start/end before processing |
| Batch Video Upload | Upload multiple videos at once |
| Feature | Description |
|---|---|
| Resize Handles | 8-point resize on any selected overlay |
| Drag & Reposition | Move overlays by dragging |
| Undo / Redo | Ctrl+Z / Ctrl+Y with 50-step history per slide |
| Copy / Paste | Ctrl+C / Ctrl+V across slides |
| Snap Grid | Toggle alignment grid (every 10%) with 5% snapping |
| Slide Reordering | Drag thumbnails to rearrange |
| Crop Tool | Crop slide images to a selected region |
| Rotate | Rotate slides 90 CW / CCW |
| Right-Click Menu | Context menu: Edit, Duplicate, Delete, Bring to Front, Send to Back |
| Keyboard Shortcuts | Press ? to see the full shortcut cheatsheet |
| Feature | Description |
|---|---|
| QR Code Generator | Enter a URL, generates QR code as an image overlay |
| Custom Watermark | Add text watermark — center, bottom-right, or tiled, with opacity control |
| Find & Replace | Search and replace text across all slide overlays |
| Feature | Description |
|---|---|
| Save Template | Save current slides + overlays as a reusable named template |
| Load Template | Restore slides from a saved template |
| Delete Template | Remove templates you no longer need |
| Save Version | Snapshot current state for rollback |
| Restore Version | Revert to any previously saved version |
| Version List | Browse all saved versions with slide count |
| Feature | Description |
|---|---|
| Comment Tool | Click anywhere on a slide to place a comment pin |
| Comment Panel | Right panel tab listing all comments per slide |
| Resolve Comments | Mark comments as resolved |
| Delete Comments | Remove individual comments |
| Format | Description |
|---|---|
| PPTX | PowerPoint with slide images + editable text overlay layers |
| Multi-page PDF of all slides | |
| PNG ZIP | Download all slides as a ZIP of PNG images |
| Animated GIF | Export slides as an animated GIF slideshow (custom duration) |
| Video | Clean MP4 with logo removed and audio preserved |
| Feature | Description |
|---|---|
| Fullscreen | F5 enters distraction-free fullscreen presentation |
| Arrow Navigation | Left/Right arrows to navigate slides |
| Escape to Exit | Press Escape to return to editor |
| Feature | Description |
|---|---|
| Glassmorphism Theme | Modern frosted glass dark theme with Inter font |
| Organized Toolbar | Labeled tool groups: TOOLS, EDIT, INSERT, SLIDE, MANAGE |
| Drag & Drop Upload | Drop PPTX files anywhere to upload |
| Auto-Save Indicator | Pulsing orange dot when unsaved, green checkmark on save |
| Loading Overlay | Spinner during long operations |
| Toast Notifications | Success / error / info messages with icons |
| Crossfade Navigation | Smooth slide transitions |
| Responsive Toolbar | Wraps on smaller screens |
Fastest path — see INSTALL.md for the full cross-platform guide. TL;DR:
# Clone the repo from GitHub to your machine
git clone https://github.com/Layruss98266/slidecraft.git
# Move into the project folder
cd slidecraft
# Run the launcher for your OS — it will:
# 1. Create a Python virtual environment in .venv/
# 2. Install everything listed in requirements.txt
# 3. Warn you if LibreOffice isn't installed
# 4. Start the Flask server on http://127.0.0.1:5050
./run.sh # macOS / Linux (chmod +x run.sh once if needed)
# or run.bat # Windows (cmd.exe / double-click)
# or .\run.ps1 # Windows (PowerShell)The launcher creates .venv/, installs requirements.txt, warns if LibreOffice isn't installed, then starts the server at http://127.0.0.1:5050. First run takes ~3 min (LibreOffice optional but strongly recommended for high-fidelity slide rendering).
After the install steps above, just re-run the launcher whenever you want to start the editor. It's idempotent — it skips the venv/install steps if they've already been done.
# macOS / Linux
./run.sh:: Windows (cmd.exe)
run.bat# Windows (PowerShell)
.\run.ps1Then open http://127.0.0.1:5050 in any modern browser (Chrome, Edge, Firefox, Safari).
# 1. Activate the virtual environment
source .venv/bin/activate # macOS / Linux
.venv\Scripts\Activate.ps1 # Windows PowerShell
.venv\Scripts\activate.bat # Windows cmd.exe
# 2. Start the server (Ctrl+C to stop)
python app.pyAll optional — sensible defaults if unset.
# Bind on all interfaces so other machines on your LAN can reach the editor.
# WARNING: there's no built-in auth — only do this on a trusted network.
HOST=0.0.0.0 python app.py
# Use a different port (e.g. if 5050 is taken)
PORT=8080 python app.py
# Allow larger uploads (default is 60 MB total per request)
MAX_UPLOAD_MB=200 python app.py
# Combine multiple
HOST=0.0.0.0 PORT=8080 MAX_UPLOAD_MB=200 python app.pyOn Windows PowerShell use $env:HOST = "0.0.0.0"; python app.py instead.
See INSTALL.md for the full list.
Press Ctrl+C in the terminal where it's running. State on disk (uploaded PPTX, slide images, history snapshots) is preserved — the next start picks up where you left off.
1. Run the launcher → server listens on :5050
2. Open http://127.0.0.1:5050 in a browser → empty editor
3. Click "Upload" and pick a .pptx file → slides appear in the strip
4. Edit / OCR / watermark / filter / etc. → every change auto-saves
5. Click "Export" → "PowerPoint (PPTX)" → download the edited deck
The first slide upload triggers a one-time ~64 MB EasyOCR model download to ~/.EasyOCR/. After that, OCR is instant.
SlideCraft requires Python 3.10 or higher.
Windows
- Go to python.org/downloads
- Download the latest Python installer (e.g. Python 3.12.x)
- Run the installer
- IMPORTANT: Check the box "Add Python to PATH" at the bottom of the installer
- Click "Install Now"
- Verify installation — open Command Prompt and run:
You should see something like
python --versionPython 3.12.x
macOS
- Install Homebrew if you don't have it:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - Install Python:
brew install python
- Verify:
python3 --version
Linux (Ubuntu/Debian)
sudo apt update
sudo apt install python3 python3-pip python3-venv
python3 --versionOption A — Clone with Git (recommended):
git clone https://github.com/YOUR_USERNAME/slidecraft.git
cd slidecraftOption B — Download ZIP:
- Click the green "Code" button on GitHub
- Click "Download ZIP"
- Extract the ZIP file
- Open a terminal/command prompt in the extracted folder
This keeps SlideCraft's packages separate from your system Python.
Windows:
python -m venv venv
venv\Scripts\activatemacOS / Linux:
python3 -m venv venv
source venv/bin/activateYou'll see
(venv)at the start of your terminal prompt when the virtual environment is active.
pip install -r requirements.txtThis installs all required packages:
| Package | What it does | Size |
|---|---|---|
flask |
Web server | ~2 MB |
python-pptx |
Read/write PowerPoint files | ~5 MB |
Pillow |
Image processing & filters | ~10 MB |
opencv-python-headless |
Inpainting, video frames, filters | ~40 MB |
easyocr |
Text detection (OCR) | ~150 MB |
moviepy |
Video audio handling & trimming | ~5 MB |
numpy |
Array operations | (with opencv) |
torch |
AI backend for EasyOCR | ~200-800 MB |
Note: First install may take 2-5 minutes. The
torchpackage is the largest (~200MB CPU-only).
If you get an error with pip, try:
python -m pip install -r requirements.txtOptional — for QR code generation:
pip install qrcode[pil]Windows:
set PYTHONIOENCODING=utf-8 && python app.pymacOS / Linux:
PYTHONIOENCODING=utf-8 python3 app.pyDev mode: To enable Flask debug mode (auto-reload on code changes), set
FLASK_DEBUG=true:FLASK_DEBUG=true PYTHONIOENCODING=utf-8 python app.py
You should see:
* Running on http://0.0.0.0:5050
Open your browser and go to:
http://localhost:5050
That's it! SlideCraft is running.
First time using OCR? The first time you click the "OCR" button, EasyOCR will download its text detection models (~100 MB). This is a one-time download.
LibreOffice enables high-fidelity PPTX-to-image conversion. Without it, SlideCraft falls back to extracting embedded images.
Windows: Download from libreoffice.org and install.
macOS:
brew install --cask libreofficeLinux:
sudo apt install libreoffice- Click Upload in the header, or drag & drop a
.pptxfile anywhere - Slides are converted to images and loaded into the editor
- Click Remove Logo in the header — all slides processed via OpenCV inpainting
- Click OCR in the toolbar — text regions highlighted with blue dashed boxes
- Click any region — creates a background cover + editable text overlay
- Edit text in the Properties panel, adjust font/size/color/weight
- Click Apply to burn changes permanently into the slide image
- Press
Cor click the Cover tool - Draw a rectangle over text to replace
- Type replacement text in Properties panel
- Click Apply to bake
- Use toolbar tools: Rectangle (
R), Circle, Line, Callout, Freehand Draw - All shapes are resizable and repositionable
- Right-click for context menu: Duplicate, Delete, Bring to Front/Back
- Switch to Filters tab in the right panel
- Click any filter button — applies instantly to the current slide
- Click Templates icon in toolbar
- Save current state as a named template
- Load any saved template to restore slides + overlays
- Click History icon in toolbar
- Save Version to snapshot current state
- Restore any previous version
- Click Comments tool, then click on the slide to place a pin
- Enter comment text — visible as numbered pins on the canvas
- Switch to Comments tab in the right panel to view/resolve/delete
| Button | Output |
|---|---|
| PPTX | PowerPoint with overlays as editable layers |
| Multi-page PDF | |
| PNG | ZIP archive of all slides as PNG |
| GIF | Animated GIF slideshow |
| Apply | Burns overlays into slide images (no layers) |
- Click Video in the header (or go to
/video) - Upload video file (any format)
- Drag the red box over the logo on the preview frame
- Click Remove Logo — watch real-time progress
- Click Stop to cancel if needed
- Download the clean video when done
Press ? in the editor to see the full cheatsheet.
| Key | Action |
|---|---|
S |
Select tool |
T |
Text tool |
R |
Rectangle tool |
C |
Cover & Type tool |
G |
Toggle snap grid |
? |
Show all keyboard shortcuts |
F5 |
Fullscreen presentation mode |
Ctrl+Z |
Undo |
Ctrl+Y |
Redo |
Ctrl+C |
Copy selected overlay |
Ctrl+V |
Paste overlay |
Ctrl+S |
Save current slide |
Delete |
Delete selected overlay |
Escape |
Exit presentation / close modals |
Arrow Left/Right |
Navigate slides |
slidecraft/
├── app.py # Flask backend — 44 API routes
├── requirements.txt # Python dependencies
├── LICENSE # MIT license
├── .gitignore # Git ignore rules
├── slide_data.json # Auto-generated overlay data store
├── comments.json # Auto-generated comments store
├── static/
│ └── slides/ # Slide JPG images (auto-generated)
├── uploads/ # Uploaded PPTX files
├── exports/ # Exported PPTX/PDF/ZIP/GIF files
├── videos/ # Uploaded & processed videos
├── history/ # Version history snapshots
├── templates_saved/ # Saved slide templates
└── templates/
├── index.html # Main slide editor UI (~3900 lines)
└── video.html # Video logo remover UI
| Method | Endpoint | Description |
|---|---|---|
GET |
/ |
Main editor page |
GET |
/api/slide/<num> |
Get overlays + notes for a slide |
POST |
/api/slide/<num> |
Save overlays + notes |
POST |
/api/slide/<num>/bake |
Burn overlays into slide image |
POST |
/api/slide/<num>/preview |
Render composite preview with overlays |
POST |
/api/slide/<num>/filter |
Apply image filter |
POST |
/api/slide/<num>/crop |
Crop slide image |
POST |
/api/slide/<num>/rotate |
Rotate slide image |
POST |
/api/upload |
Upload PPTX file |
POST |
/api/remove-logo |
Remove NotebookLM logo from all slides |
POST |
/api/reorder |
Reorder slides |
POST |
/api/upload-image |
Upload image for overlay use |
POST |
/api/ocr/<num> |
Run EasyOCR on a slide |
POST |
/api/sample-color/<num> |
Sample bg color, text color, font weight |
POST |
/api/qr-generate |
Generate QR code image |
POST |
/api/watermark |
Add text watermark to all slides |
POST |
/api/watermark-image |
Add image/logo watermark to all slides |
POST |
/api/detect-watermark/<num> |
Auto-detect watermark regions in a slide |
POST |
/api/remove-watermark/<num> |
Remove watermark from single slide |
POST |
/api/remove-watermark-all |
Remove watermark from all slides |
POST |
/api/find-replace |
Find and replace text in overlays |
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/export |
Export as PPTX |
POST |
/api/export-pdf |
Export as PDF |
POST |
/api/export-png-zip |
Export as PNG ZIP |
POST |
/api/export-gif |
Export as animated GIF |
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/batch/remove-logo |
Bulk upload up to 20 PPTX, remove logos, return ZIP |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/templates |
List saved templates |
POST |
/api/templates/save |
Save current state as template |
POST |
/api/templates/load |
Load a template |
POST |
/api/templates/delete |
Delete a template |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/history |
List all versions |
POST |
/api/history/save |
Save a version snapshot |
POST |
/api/history/restore |
Restore a version |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/comments/<num> |
Get comments for a slide |
POST |
/api/comments/<num> |
Add a comment |
POST |
/api/comments/<num>/resolve |
Resolve a comment |
POST |
/api/comments/<num>/delete |
Delete a comment |
| Method | Endpoint | Description |
|---|---|---|
GET |
/video |
Video logo remover page |
POST |
/api/video/upload |
Upload video file |
POST |
/api/video/preview-frame |
Get a preview frame |
POST |
/api/video/remove-logo |
Start logo removal (returns jobId) |
GET |
/api/video/progress/<jobId> |
Poll job progress |
POST |
/api/video/stop/<jobId> |
Stop a running job |
GET |
/api/video/download/<file> |
Download processed video |
| Layer | Technology |
|---|---|
| Backend | Python 3.10+, Flask 3.x |
| PPTX | python-pptx |
| Image Processing | Pillow, OpenCV (inpainting, filters) |
| OCR | EasyOCR (PyTorch-based, no external binary) |
| Video | OpenCV (frames), MoviePy (audio mux, trim) |
| Frontend | Vanilla JavaScript, HTML5 Canvas, CSS3 |
| Theme | Glassmorphism dark theme, Inter font |
| Icons | Inline SVG stroke icons |
Uses OpenCV's Telea inpainting algorithm:
- Binary mask marks the logo region
- Algorithm propagates pixels from all surrounding edges inward
- Follows natural color gradients and textures
- Result: seamless removal with no flat bands
- EasyOCR detects text regions with bounding boxes
sample-colorAPI analyzes the region:- Background color from a strip above the text
- Text color from pixels with highest contrast
- Font weight from ink density (normal/semibold/bold/extrabold)
- Cover rectangle + text overlay created with matched colors/weight
- Apply burns it into the image using Pillow with correct system font
- Background thread processes each frame with OpenCV inpainting
- Progress reported via polling API (frame count, percentage, ETA)
- Cancellation supported — stops the thread cleanly
- MoviePy muxes audio from original into the clean video
| Issue | Solution |
|---|---|
| OCR not working | EasyOCR downloads models on first use (~100MB). Ensure internet access. |
UnicodeEncodeError on Windows |
Run with set PYTHONIOENCODING=utf-8 && python app.py |
| Video processing slow | ~10-30 fps depending on resolution. 1080p 5min = ~5-8 min. |
| Fonts don't match exactly | Use the Font Family dropdown in Properties. |
| PPTX upload shows blank slides | Install LibreOffice for proper conversion. |
| QR code shows placeholder | Install qrcode package: pip install qrcode[pil] |
| Stop button not working | Wait a few seconds — cancellation is checked every frame. |
- Fork the repo
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
MIT License. See LICENSE for details.
Built with Flask + Pillow + OpenCV + EasyOCR + MoviePy
44 API routes | 45+ features | 0 build steps