A lightweight macOS menu bar screenshot utility with global hotkeys, preview window, and clipboard support.
- Full Screen Capture: Press
Cmd+Shift+1to capture the entire screen - Region Capture: Press
Cmd+Shift+2to select and capture a region - Preview Window: Review screenshots before saving or copying
- Clipboard Support: Copy screenshots directly to clipboard
- Menu Bar App: Quick access to all features from the menu bar
- Configurable: Choose save location and image format (PNG/JPEG)
- Native macOS: Uses native macOS APIs for best performance
- macOS 12 (Monterey) or later
- Python 3.11+
- Xcode Command Line Tools (for building)
- Screen Recording: Required to capture screenshots
- Accessibility: Required for global hotkeys to work
Download the latest Screeny.app from the Releases page, move it to your Applications folder, and double-click to run.
# Clone the repository
git clone https://github.com/yourusername/screeny.git
cd screeny
# Create and activate virtual environment
python3 -m venv venv
source venv/bin/activate
# Install dependencies
pip install -r requirements.txt
# Run directly
pip install -e .
screeny-
Python 3.11+ - Install via Homebrew or python.org
brew install python@3.11
-
Create a virtual environment (recommended)
python3.11 -m venv venv source venv/bin/activate -
Install dependencies
pip install -r requirements.txt pip install -r requirements-dev.txt pip install pyinstaller
-
Build the app:
pyinstaller Screeny.spec --clean -y
-
The app will be created at:
dist/Screeny.app -
Install the app:
# Copy to Applications folder cp -r dist/Screeny.app /Applications/ # Or open directly open dist/Screeny.app
The Screeny.spec file contains all build configuration. Key settings:
LSUIElement: True- App runs in menu bar only (no Dock icon)NSScreenCaptureUsageDescription- Permission description for Screen Recording- Hidden imports for PyObjC frameworks (AppKit, Foundation, Quartz)
Import errors when running the built app:
# Run from terminal to see error messages
dist/Screeny.app/Contents/MacOS/ScreenyMissing modules:
Add missing modules to hiddenimports in Screeny.spec and rebuild.
Code signing issues:
# Sign the app (optional, for distribution)
codesign --force --deep --sign - dist/Screeny.app| Shortcut | Action |
|---|---|
Cmd+Shift+1 |
Capture full screen |
Cmd+Shift+2 |
Capture selected region |
| Shortcut | Action |
|---|---|
Enter or click Save |
Save screenshot |
| Click Copy | Copy to clipboard |
Escape |
Discard screenshot |
Click the Screeny icon in the menu bar to:
- Take screenshots manually
- Change save location
- Switch between PNG and JPEG formats
- Quit the application
Settings are stored at:
~/Library/Application Support/Screeny/config.json
| Setting | Default Value |
|---|---|
| Save Location | ~/Desktop |
| Format | PNG |
| JPEG Quality | 90 |
| Filename Pattern | Screeny_{YYYY}-{MM}-{DD}_{HH}-{mm}-{ss} |
| Full Screen Hotkey | Cmd+Shift+1 |
| Region Hotkey | Cmd+Shift+2 |
- Open System Settings → Privacy & Security → Screen Recording
- Click the + button and add Screeny.app
- Toggle the switch to enable
- Restart Screeny if prompted
- Open System Settings → Privacy & Security → Accessibility
- Click the + button and add Screeny.app
- Toggle the switch to enable
- Restart Screeny if prompted
Note: If running from source with
screenycommand, you may need to grant permissions to your Terminal app instead.
To have Screeny start automatically when you log in:
- Open System Settings → General → Login Items
- Under "Open at Login", click +
- Navigate to and select Screeny.app
- Check that Accessibility permission is granted to Screeny
- Restart Screeny after granting permission
- Make sure another app isn't using the same hotkey combination
- Check that Screen Recording permission is granted
- Restart Screeny after granting permission
- On first capture, macOS may prompt for permission
- Try running from terminal to see any error messages:
/Applications/Screeny.app/Contents/MacOS/Screeny
- Check Console.app for crash logs
- Some apps may not accept certain image formats
- Try saving the screenshot and opening it manually
- Ensure the save directory exists and is writable
- Check disk space if getting "disk full" errors
- Screeny will fall back to Desktop if the configured location is invalid
screeny/
├── src/screeny/
│ ├── __init__.py # Package version and exports
│ ├── main.py # Entry point
│ ├── app.py # Main application coordinator
│ ├── menu_bar.py # Menu bar UI (rumps)
│ ├── hotkeys.py # Global hotkey listener (pynput)
│ ├── capture.py # Screenshot capture logic
│ ├── preview.py # Preview window (PyObjC)
│ ├── settings.py # Settings management
│ ├── notifications.py # macOS notifications
│ ├── permissions.py # Permission checking
│ └── resources/
│ ├── icon.png # Original icon
│ └── iconTemplate.png # Menu bar template icon
├── tests/ # Test suite
├── Screeny.spec # PyInstaller build configuration
├── pyproject.toml # Project metadata
├── requirements.txt # Runtime dependencies
└── requirements-dev.txt # Development dependencies
# Clone repository
git clone https://github.com/yourusername/screeny.git
cd screeny
# Create virtual environment
python3.11 -m venv venv
source venv/bin/activate
# Install in editable mode with dev dependencies
pip install -e .
pip install -r requirements-dev.txt
# Run the app
screenypytestruff check .mypy src/screeny| Package | Purpose |
|---|---|
rumps |
Menu bar app framework |
pynput |
Global hotkey listener |
Pillow |
Image processing |
pyobjc-framework-Cocoa |
macOS Cocoa APIs |
pyobjc-framework-Quartz |
Screen capture APIs |
| Package | Purpose |
|---|---|
pyinstaller |
Create standalone .app bundle |
- Fork the repository
- 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.