⬑ ββββββββββββββββββββββββββββββββββββββββββββββββ ⬑
____ ____ _
|_ /___ _ _ / ___|__ _| |
/ // -_) ' \ | | / _` | |
/___\___|_||_| \___|\__,_|_|
Distraction-Free Event Reminders
⬑ ββββββββββββββββββββββββββββββββββββββββββββββββ ⬑
A minimal, distraction-free full-screen event reminder that you can't ignore.
Download Latest Release β’ Report Bug β’ Request Feature
ZenCal is a minimal, distraction-free full-screen event reminder that takes over your entire screen when it's time for important events. No more missing meetings because you ignored a tiny notification popup.
Traditional calendar apps show small notification popups that are easy to ignore or dismiss. You glance at them, think "I'll remember" then you forget.
ZenCal takes over your entire screen with large, impossible-to-ignore text when an event starts. It stays on screen for the exact duration you specify, then disappears. Simple. Effective. Impossible to miss.
- π₯οΈ Fullscreen Takeover : Impossible to ignore when events start
- β±οΈ Live Countdown : Real-time timer showing remaining duration
- π Visual Calendar : Month grid with event indicators
- π Repeating Events : Daily, weekdays, weekly, monthly patterns
- πΎ Export/Import : Sync events between devices via JSON
- πΌοΈ System Tray : Runs silently in background
- β‘ Lightweight : No bloat, minimal resource usage
- π Open Source : MIT License, fully hackable
Installer (Recommended)
- Download
ZenCal-Setup-1.0.3.exefrom Releases - Run the installer
- Find ZenCal and ZenCal Manager in Start Menu
- Done! β¨
Option 1: Install Script
# Download release
git clone https://github.com/medtty/zencal.git
cd zencal
# Install system-wide
sudo ./install_linux.sh
# Or user-only
./install_linux.sh
# Launch
zencal # Overlay
zencal --manager # ManagerOption 2: Run from Source
git clone https://github.com/medtty/zencal.git
cd zencal
python zencal.pyWindows:
- Start Menu β ZenCal
Linux:
zencalA small window appears showing "No events scheduled"
Click the "β MANAGER" button in the overlay (or run zencal --manager)
In the manager:
- Click "+ ADD"
- Fill in:
- Title: "Team Meeting"
- Date: 2026-02-15
- Time: 14:30 (2:30 PM)
- Duration: 60 minutes
- Repeat: none
- Note: "Bring laptop"
- Click "SAVE"
When the event time arrives:
- Your screen goes fullscreen automatically
- Large text shows: TEAM MEETING
- Live countdown: 60m 0s remaining
- After 60 minutes, it exits fullscreen automatically
{
"title": "Daily Standup",
"date": "2026-02-10",
"time": "09:00",
"duration_minutes": 15,
"repeat": "weekdays",
"note": "Zoom link: zoom.us/j/123"
}{
"title": "Gym",
"date": "2026-02-10",
"time": "18:00",
"duration_minutes": 90,
"repeat": "weekly",
"note": "Leg day"
}{
"title": "Doctor Appointment",
"date": "2026-02-20",
"time": "14:30",
"duration_minutes": 30,
"repeat": "none",
"note": "Room 302"
}Edit ui/theme.py:
THEME = {
"accent": "#00d9ff", # Cyan (default)
"bg_dark": "#0a0a0f", # Dark background
"text": "#e2e8f0", # Light text
}Popular Themes:
# Dracula
"accent": "#bd93f9", "bg_dark": "#282a36"
# Nord
"accent": "#88c0d0", "bg_dark": "#2e3440"
# Gruvbox
"accent": "#83a598", "bg_dark": "#282828"
# Tokyo Night
"accent": "#7aa2f7", "bg_dark": "#1a1b26"Edit ui/theme.py:
FONTS = {
"primary": "Consolas", # Or any monospace font
"fallback": "Courier",
}Manager β β SETTINGS
Or edit calendar.json:
{
"settings": {
"check_interval_seconds": 5,
"font_size": 72,
"font_color": "#00d9ff",
"bg_color": "#0a0a0f"
}
}Device A:
- Manager β β¬ EXPORT
- Save as
zencal_backup.json
Device B:
- Manager β β¬ IMPORT
- Choose file
- Select "Merge" or "Replace"
Using Dropbox/Google Drive:
# Move calendar.json to synced folder
mv calendar.json ~/Dropbox/zencal/calendar.json
# Create symlink
ln -s ~/Dropbox/zencal/calendar.json ./calendar.jsonBoth devices now share the same events automatically!
# Overlay mode (default)
zencal # Run overlay
zencal --verbose # Show logs
zencal --clear-log # Clear log file
# Manager mode
zencal --manager # Open event manager
# Help
zencal --help # Show all options| Key | Action |
|---|---|
ESC |
Exit fullscreen / Minimize to tray |
F11 |
Toggle fullscreen |
Q |
Quit (with confirmation) |
-
Check event format:
- Date:
YYYY-MM-DD(e.g.,2026-02-15) - Time:
HH:MMin 24-hour format (e.g.,14:30not2:30 PM)
- Date:
-
Run with logs:
zencal --verbose- Verify event exists:
zencal --managerInstall dependencies:
pip install pystray pillowWindows: Ensure Python is in PATH:
python --versionLinux: Make script executable:
chmod +x zencal.pyIncrease check interval:
{"settings": {"check_interval_seconds": 30}}zencal/
βββ zencal.py # Main entry point
βββ zencal.ico # Application icon
βββ zencal.png # Icon (PNG format)
βββ calendar.json # Your events (auto-generated)
βββ zencal.log # Debug log (auto-generated)
β
βββ core/ # Core functionality
β βββ config.py # Config loading/saving
β βββ events.py # Event matching logic
β βββ logger.py # Logging system
β
βββ ui/ # User interface
β βββ theme.py # Colors & fonts β CUSTOMIZE HERE
β βββ overlay.py # Fullscreen overlay
β βββ manager_window.py # Event manager
β βββ calendar_view.py # Calendar grid
β βββ dialogs.py # Dialogs
β
βββ build_windows.py # Windows build script
βββ build_linux.sh # Linux build script
βββ installer_windows.iss # Inno Setup script
βββ README.md
pip install pyinstaller pystray pillowWindows:
python build_windows.py
# Output: dist/ZenCal.exeLinux:
chmod +x build_linux.sh
./build_linux.sh
# Output: dist/ZenCalWindows:
- Install Inno Setup
- Run:
build_installer.bat - Output:
installer_output/ZenCal-Setup-1.0.0.exe
Contributions are welcome!
- Fork the repository
- Create feature branch:
git checkout -b feature/amazing-feature - Commit changes:
git commit -m 'Add amazing feature' - Push:
git push origin feature/amazing-feature - Open Pull Request
MIT License : see LICENSE for details.
TL;DR: Use it however you want, commercially or personally. No restrictions. Attribution appreciated but not required.
- Font: JetBrains Mono
- Built with: Python + Tkinter + β€οΈ
- π Report Bugs
- π‘ Request Features
- β Star on GitHub
⬑ Built for people who value their time and attention ⬑
Made with ⬑ by MEDY