A macOS tool to quickly switch your display to a lower resolution for crisp screen sharing, with automatic window tiling.
Perfect for YouTube, Google Meet, Zoom, or any screen sharing where viewers benefit from a cleaner, lower-resolution view.
- Auto-detects your display - works with any Mac display (built-in Retina, external monitors)
- Smart resolution switching - finds the best ~1280px presentation resolution for your display
- Automatic window tiling - resizes all windows to fill the screen with macOS-style padding
- Menu bar management - hides menu bar in presentation mode for maximum space
- State preservation - remembers and restores your original resolution on exit
- Raycast integration - includes script commands for quick access
-
Python 3.11+ (3.14 recommended)
# Check your version python3 --version # Install via pyenv if needed brew install pyenv pyenv install 3.14.0
-
displayplacer - for display resolution switching
brew install displayplacer
-
Poetry - for Python dependency management
brew install poetry
The tool requires Accessibility permissions to resize windows.
- Open System Settings → Privacy & Security → Accessibility
- Click the lock icon and enter your password
- Add your terminal app (Terminal, iTerm2, etc.) or Raycast
- Ensure the checkbox is enabled
- Restart the app after granting permissions
# Clone the repository
git clone https://github.com/thatgardnerone/presentation-mode.git
cd presentation-mode
# Install dependencies
poetry install# Enter presentation mode
poetry run enter-presentation-mode
# Exit presentation mode
poetry run exit-presentation-mode- Add the
presentation-modefolder to Raycast's Script Commands directories - Search for "Enter Presentation Mode" or "Exit Presentation Mode"
- Optionally assign keyboard shortcuts
./enter-presentation-mode.sh
./exit-presentation-mode.sh- Hides the menu bar for maximum screen space
- Saves your current resolution for later restoration
- Switches to ~1280px width - finds the closest scaled mode to 1280px
- Tiles all windows with 12px padding (macOS Tahoe style)
- Shows the menu bar
- Restores your original resolution
- Re-tiles all windows to fit the restored resolution
Edit src/presentation_mode/config.py to customize:
# Target width for presentation mode (finds closest available)
PRESENTATION_TARGET_WIDTH = 1280
# Window padding (macOS Tahoe Liquid Glass style)
PADDING_TOP = 12
PADDING_BOTTOM = 12
PADDING_HORIZONTAL = 12
# Delay after resolution change (seconds)
RESOLUTION_CHANGE_DELAY = 2.0- Uses displayplacer to enumerate available display modes and switch resolutions
- Uses PyObjC (Quartz/Cocoa frameworks) to:
- Detect the main display
- Get the visible screen area (excluding menu bar/dock)
- Enumerate windows via
CGWindowListCopyWindowInfo - Resize windows via the Accessibility API (
AXUIElement)
- Saves state to
~/.presentation-mode-state.json
Your display may not have a ~1280px scaled mode. Check available modes:
displayplacer list- Ensure Accessibility permissions are granted (see Prerequisites)
- Try toggling the permission off and on, then restart the app
- Some apps (like Finder desktop) intentionally cannot be resized
The tool saves your resolution before entering presentation mode. If the state file is corrupted:
rm ~/.presentation-mode-state.jsonThen manually set your preferred resolution in System Settings.
presentation-mode/
├── pyproject.toml # Poetry configuration
├── enter-presentation-mode.sh # Raycast wrapper
├── exit-presentation-mode.sh # Raycast wrapper
└── src/presentation_mode/
├── __init__.py
├── cli.py # CLI entry points
├── config.py # Configuration
├── display.py # Display detection & switching
├── menubar.py # Menu bar hide/show
└── windows.py # Window enumeration & resizing
MIT License - feel free to use and modify as needed.