A modern command scheduler with an interactive TUI for managing scheduled tasks.
- β¨ Interactive TUI - Beautiful split-pane interface with live task details
- π Flexible Scheduling - Schedule commands at specific times with timezone support
- π Background Daemon - Reliable task execution with automatic polling
- π Script Support - Run .sh, .py, .rb, .pl, .js, .php files with auto-detection
- π Execution History - Full stdout/stderr logging for every execution
- π Desktop Notifications - Native macOS notifications for task events (start, success, failure)
- π― CLI & TUI - Use whichever interface suits your workflow
- β‘ Concurrent Execution - Run up to 10 tasks simultaneously
- π‘οΈ Protected Scheduling - Prevents task creation without running daemon
- π¦ Single Binary - One executable for CLI, TUI, and daemon management
- π Auto-Start - Daemon automatically starts when scheduling tasks if needed
./build.sh./bin/bcron daemon start # Verify it's running ./bin/bcron daemon status./bin/bcronTUI Keybindings:
n- New taske- Editd- Deleteh- Historyf- Filterr- Refreshβ/β- NavigateEnter- View detailsq- Quit
# Add a task ./bin/bcron add "echo 'Hello'" --at "2026-02-05 12:00 UTC" --name "greeting" # List tasks ./bin/bcron list # Run immediately ./bin/bcron run 1 # View logs ./bin/bcron logs 1 # View history ./bin/bcron history 1# ISO 8601 --at "2026-02-05T12:00:00Z" # With timezone --at "2026-02-05 12:00 UTC" --at "2026-02-05 14:30 EST" # Custom timezone flag --at "2026-02-05 12:00" --timezone "America/New_York"./bin/bcron add "echo 'Hello'" --at "2026-02-05 12:00 UTC" --name "test" ./bin/bcron add "ls -la /tmp" --at "2026-02-05 13:00 UTC" --name "list"Automatically detects interpreter from shebang or file extension:
./bin/bcron add "./backup.sh" --at "2026-02-05 02:00 UTC" --name "backup" ./bin/bcron add "./process_data.py" --at "2026-02-05 09:00 UTC" --name "process"Supported: .sh, .py, .rb, .pl, .js, .php
bcron sends native macOS notifications for task execution events:
-
π΅ Task Started - When a task begins execution
Title: bcron - Task Started Message: Task #5 - backup started -
β Task Completed - When a task finishes successfully
Title: bcron - Task Completed β Message: Task #5 - backup executed successfully -
β Task Failed - When a task fails
Title: bcron - Task Failed β Message: Task #5 - backup failed to execute
- macOS: Full support via native Notification Center
- Linux/Windows: Gracefully skipped (no errors)
Notifications are non-blocking and won't prevent task execution if they fail.
- Database:
~/.config/bcron/bcron.db - PID File:
~/.config/bcron/bcron.pid - Check Interval: 30 seconds
- Task Timeout: 1 hour
- Max Concurrent: 10 tasks
pending- Waiting to runrunning- Currently executingcompleted- Finished successfullyfailed- Finished with errorcancelled- Manually cancelled
# Start daemon ./bin/bcron daemon start # Stop daemon ./bin/bcron daemon stop # Check status (shows real PID, uptime, task counts) ./bin/bcron daemon status# Check status ./bin/bcron daemon status # Remove stale PID file if needed rm ~/.config/bcron/bcron.pid # Start daemon ./bin/bcron daemon startIf you see β οΈ Warning: Scheduler daemon is not running!, start the daemon first:
./bin/bcron daemon startNote: In auto-start mode, the daemon will start automatically when you add tasks.
bcron ships with an MCP server so AI assistants (Claude, etc.) can schedule and manage tasks directly.
cd mcp uv run bcron-mcpOr with pip:
cd mcp pip install . bcron-mcpAdd to ~/Library/Application Support/Claude/claude_desktop_config.json:
{ "mcpServers": { "bcron": { "command": "uv", "args": ["--directory", "/path/to/bash-cron/mcp", "run", "bcron-mcp"] } } }| Tool | Description |
|---|---|
schedule_task | Schedule a command to run at a specific time |
list_tasks | List all tasks (optionally filtered by status) |
get_task | Get a single task by ID or name |
get_task_logs | Get stdout/stderr from the latest execution |
cancel_task | Cancel a pending task |
daemon_status | Check if the scheduler daemon is running |
daemon_start | Start the scheduler daemon |
Note: Update
BCRON_BINinmcp/server.pyto point to your bcron binary if it's not at the default path.
For detailed information, see CLAUDE.md
MIT
0.1.0 - Production Ready