Espresso prevents session timeouts and monitors for notifications in remote desktop applications (like Citrix Viewer) on macOS.
Three monitoring modes:
- 🎹 Keepalive - Simulates keyboard activity to prevent timeouts
- 🔔 Audio Monitoring - Detects Teams calls/notifications via audio
- 📺 Screen Monitoring - Visual notification detection with OCR
# Install directly (tap is added automatically)
brew install slauger/tap/espresso
# Launch
open /Applications/Espresso.appThe ☕ icon appears in your menu bar. Click it to enable features.
Note: On first launch, macOS will show a Gatekeeper warning (app is not signed). Right-click Espresso.app → "Open" → Click "Open" again, or run:
xattr -cr /Applications/Espresso.app
- Download the latest release from GitHub Releases
- Open the DMG and drag Espresso.app to Applications
- First launch: Right-click Espresso.app → "Open" → Click "Open" again
- macOS will show a Gatekeeper warning (app is not signed)
- Alternative:
xattr -cr /Applications/Espresso.appin Terminal
The ☕ icon appears in your menu bar. Click it to enable features.
Note: The app is not code-signed (requires Apple Developer Account $99/year). It's safe to run, source code is public.
# Clone and install
git clone https://github.com/slauger/espresso-macos.git
cd espresso-macos
pip install -e .[full]
# Launch GUI (works without config!)
espresso-gui
# Optional: Setup autostart with config
mkdir -p ~/.espresso
cp examples/config-autostart.json ~/.espresso/config.json- ☕ Universal - Works with any macOS app (Citrix, Teams, Slack)
- 🎨 Menu Bar GUI - Simple click-to-enable interface
- ⚙️ Configurable - JSON config or command-line options
- 🧠 Smart - Only monitors when app is running
- 🔒 Non-intrusive - Keyboard simulation (no mouse movement)
- 📦 Lightweight - Minimal resource usage
Configuration is optional! Espresso works out of the box with sensible defaults.
{
"app_name": "Citrix Viewer",
"interval_seconds": 60,
"autostart": true,
"autostart_audio": true,
"audio_device": "BlackHole 2ch"
}Default values (when no config exists):
app_name: "Citrix Viewer"interval_seconds: 60autostart: false (manual start)audio_device: null (configure for audio monitoring)
See examples/ for complete configuration examples.
Monitor audio from remote desktop to catch Teams calls and notifications.
📖 Audio Monitoring Setup Guide
Detect notifications visually via screenshot analysis and OCR.
📖 Screen Monitoring Setup Guide
- 📖 Audio Monitoring Setup
- 📖 Audio Fingerprinting
- 📖 Screen Monitoring Setup
- 📖 Development Guide
- 📖 Homebrew Tap Setup (for maintainers)
- 📋 Config Examples
# Install dependencies
pip install -e .[full,dev]
# Build with PyInstaller
pyinstaller espresso-gui.spec
# Output: dist/Espresso.appReleases are automated via semantic-release:
- Push to
mainwith conventional commits (feat:,fix:, etc.) - GitHub Actions automatically:
- Creates git tag and GitHub Release
- Builds macOS binary (.app)
- Generates DMG and ZIP archives
- Updates Homebrew tap
See HOMEBREW_SETUP.md for Homebrew tap configuration.
- Binary: Open Espresso.app from Applications
- From source: Run
espresso-guiin terminal
Click the ☕ menu bar icon to:
- Enable/disable keepalive
- Enable/disable audio monitoring
- Enable/disable screen monitoring
- View status and logs
For automation or headless usage:
espresso --app "Citrix Viewer" --interval 60 --config ~/.espresso/config.jsonespresso-gui [OPTIONS]
Options:
--app TEXT Target application name (default: Citrix Viewer)
--interval INT Seconds between keepalive actions (default: 60)
--audio-device TEXT Audio device for monitoring (e.g., BlackHole)
--autostart Start keepalive automatically
--autostart-audio Start audio monitoring automatically
--autostart-screen Start screen monitoring automatically
--debug Enable verbose logging
--config PATH Path to JSON config file
- macOS 10.15+
- Python 3.9+
Optional:
- BlackHole for audio monitoring
- Screen Recording permission for screen monitoring
Just like a shot of espresso keeps you awake, this app keeps your sessions awake! ☕
MIT License - see LICENSE file for details.
Issues and pull requests welcome!
For major changes, please open an issue first to discuss what you'd like to change.