A Windows desktop application that monitors the Kacky schedule and notifies you when your watched maps go live. Built with Python and Tkinter, packaged as a standalone EXE.
THIS HAS BEEN MADE WITH AI.
- Real-time Monitoring: Tracks map schedules across multiple servers
- Desktop Notifications: Windows toast notifications when watched maps go live
- Smart Polling: Efficient fetching with local countdown - only syncs times when needed
- Multiple Server Support: Tracks maps across all servers simultaneously
- Persistent State: Remembers your watched maps and settings between sessions
- No Terminal Required: Windowed application (EXE) runs without a console window
-
Download from GitHub Releases
- Go to Releases
- Download the latest
KackyWatcher.zip - Extract the zip file
- Run
KackyWatcher.exeinside any folder (Creates Files)
-
First Run Setup
- On first launch, the app will prompt you to install Playwright browsers (required)
- Python 3.11+ must be installed on your system for browser installation
- Click "Yes" to install (downloads ~100-200MB, takes a few minutes)
- The app cannot function without Playwright browsers
- After browsers are installed, the EXE works independently (Python only needed for initial setup)
-
Configuration Files
settings.json- Application settings (created automatically)map_status.json- Tracking state and watched maps (created automatically)log.txt- Application logs (created automatically)
All files are created in the same folder as
KackyWatcher.exeon first run.
- Windows 10 or later
- Python 3.11 or later (required for browser installation on first run)
- The EXE bundles Python runtime, but system Python is needed to install Playwright browsers
- After browsers are installed, the EXE works independently
- Playwright browsers (installed automatically on first run)
- Requires Python to be installed on first run only
- Launch
KackyWatcher.exe - In the left pane, check the boxes next to map numbers you want to track
- Maps are automatically saved to
map_status.json - Uncheck boxes to remove maps from tracking
Live Maps:
- Maps currently live on any server
- Shows server name and remaining time
- Notifications are sent when a map first goes live
Tracked Maps:
- Upcoming maps with ETA (estimated time until live)
- Sorted by earliest ETA
- Shows which server the map will be on
Status Bar:
- Shows current activity (fetching, idle, etc.)
- Displays warnings if website is unreachable
Access settings via Settings > Configure... in the menu:
- Enable Notifications: Toggle desktop notifications (Windows toast)
- Log Level: Set logging level (DEBUG, INFO, WARNING, ERROR)
- Use DEBUG for troubleshooting
- INFO is recommended for normal use
The application uses a smart polling system that minimizes website requests:
- Initial Fetch: Fetches schedule on startup to get current state
- Local Countdown: ETAs and live times count down locally every second
- State Transitions: Tracked maps automatically become live when ETA hits 0
- Time Syncing: Fetches only when:
- New maps are added to tracking (no data available)
- Live maps need resync (1 minute after going live)
- Periodic refetch (every 60s for unknown time maps, or 5 minutes for staleness prevention)
- Live Persistence: Maps stay "live" until their time expires, then check if they're live again
- No unnecessary fetches: State transitions (tracked → live) happen locally
- Efficient: Only fetches to sync times with the server
- Resilient: Handles network issues and website transitions gracefully
- Fast: Local countdown provides instant updates without waiting for website
Note: The EXE version only supports GUI mode. CLI mode is available when running from source.
- Python 3.11 or higher
- pip (Python package manager)
- Git (for cloning the repository)
-
Clone the repository
git clone https://github.com/flewrider/kackychecker.git cd kackychecker -
Create a virtual environment (recommended)
# Windows (PowerShell) python -m venv .venv .\.venv\Scripts\Activate.ps1 # Linux/Mac python -m venv .venv source .venv/bin/activate
-
Install dependencies
pip install -r requirements.txt
-
Install Playwright browsers
python -m playwright install chromium
-
Run the application
# GUI mode (default) python main.py # CLI mode (optional) python main.py --cli
kackychecker/
├── main.py # Entry point (GUI application)
├── gui.py # GUI application (Tkinter)
├── watcher_core.py # Core polling logic
├── watcher_state.py # State management (ETAs, live maps)
├── schedule_fetcher.py # HTTP and Playwright fetching
├── schedule_parser.py # HTML parsing (BeautifulSoup)
├── settings_manager.py # Settings loading/saving
├── map_status_manager.py # Map status persistence
├── path_utils.py # Path utilities (EXE vs dev mode)
├── playwright_installer.py # Playwright browser installation
├── config.py # Configuration and logging setup
├── requirements.txt # Python dependencies
├── kacky_watcher.spec # PyInstaller spec file
├── build_exe.py # Local build script
├── .github/
│ └── workflows/
│ └── build-release.yml # GitHub Actions CI/CD
├── tests/ # Unit tests
│ ├── test_config.py
│ ├── test_parser.py
│ ├── test_state.py
│ └── test_watchlist.py
└── README.md # This file
-
Install PyInstaller
pip install pyinstaller
-
Build the EXE
python build_exe.py
Or manually:
pyinstaller kacky_watcher.spec --clean --noconfirm
-
Output
- EXE will be in
dist/KackyWatcher.exe - All dependencies are bundled in the EXE
- EXE will be in
pytest tests/When running in development mode, configuration files are created in the project directory:
settings.json- Application settingsmap_status.json- Tracks watched maps, finished maps, and server uptimeslog.txt- Application logs
The following settings are internal and not shown in the GUI (have sensible defaults):
REQUEST_TIMEOUT_SECONDS: Network timeout (default: 10 seconds)USER_AGENT: HTTP user agent stringWATCHLIST_REFRESH_SECONDS: How often to check for map status file changes (default: 20 seconds)LIVE_DURATION_SECONDS: Fallback duration when time not available from website (default: 600 seconds)
These can be modified in settings.json if needed for debugging, but are not exposed in the GUI.
State Management:
WatcherState: Manages ETAs, live windows, and notification state- Local countdown handles state transitions (tracked → live)
- Fetches only sync times, never change state
Fetching:
schedule_fetcher.py: Handles HTTP and Playwright browser fetching- Always uses Playwright first (required for JavaScript-rendered content)
- Falls back to HTTP if Playwright fails (usually won't work)
Parsing:
schedule_parser.py: Parses HTML table structure- Extracts server numbers, live maps, upcoming maps, and times
- Handles transitions (empty time cells) gracefully
GUI:
gui.py: Tkinter-based GUI- Threaded watcher loop (prevents GUI freezing)
- Queue-based updates (thread-safe GUI updates)
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Playwright browsers not found:
- The app will prompt to install on first run
- Ensure Python 3.11+ is installed on your system (required for browser installation)
- If installation fails, try running manually:
python -m playwright install chromium - Check that you have internet connection (browsers are downloaded)
- Verify Python is in your system PATH:
python --version
Maps not showing:
- Check that maps are being tracked (checkboxes in left pane in GUI)
- Verify the website structure hasn't changed (check
log.txt) - Enable DEBUG log level in settings to see detailed logs
Notifications not working:
- Ensure
ENABLE_NOTIFICATIONSis enabled in settings - Check that Windows notifications are enabled for the app
- Verify
win10toastis installed (included in EXE)
Website unreachable:
- Check your internet connection
- Verify https://kacky.gg/schedule is accessible in your browser
- Check
log.txtfor detailed error messages
- tkinter: GUI framework (included with Python)
- requests: HTTP requests (fallback)
- beautifulsoup4: HTML parsing
- playwright: Headless browser (required for JavaScript rendering)
- win10toast: Windows desktop notifications
The application requires Playwright browsers to function:
- Chromium browser (~100-200MB download)
- Installed automatically on first run
- Stored in user's AppData directory (system-wide)
- Required because the website uses JavaScript rendering
All user data files are stored in the same directory as the EXE:
settings.json: User settings (notifications, log level)map_status.json: Tracks watched maps, finished maps, and server uptimeslog.txt: Application logs (reset on each startup)
This project is provided as-is for personal use.
- Built for the Kacky community
- Schedule data from https://kacky.gg/schedule