A high-performance reminder and job scheduling system built with Go. TickTockBox uses a custom timing wheel algorithm to efficiently manage thousands of scheduled tasks, delivering notifications through RabbitMQ when reminders are due.
- Timing Wheel Scheduler: Custom implementation for high-performance task scheduling
- Web Admin Interface: User-friendly web UI for creating and managing reminders
- DateTime Picker: Modern date/time selection with timezone support
- Multi-Timezone Support: 20+ timezone options with automatic UTC conversion
- SQLite Database: Lightweight, embedded database for persistence
- RabbitMQ Integration: Reliable message delivery when reminders are due
TickTockBox implements a hierarchical timing wheel algorithm similar to those used in production systems like Redis and Kafka:
- Circular Array: Buckets organized in a circular array structure
- Hash-based Distribution: Timers distributed across buckets based on delay
- Round-based Scheduling: Long-term timers handled with round counters
- Batch Processing: Efficient processing of multiple timers per tick
- Go 1.25+
- RabbitMQ (optional, for message delivery)
- Clone the repository:
git clone https://github.com/yplog/ticktockbox.git
cd ticktockbox- Install dependencies:
go mod download- Run the application:
go run ./cmd/server/main.go- Open your browser and visit
http://localhost:8080
- Start RabbitMQ (optional):
docker run -d --name rabbitmq \
-p 5672:5672 -p 15672:15672 \
rabbitmq:3-management- Set environment variables:
export RABBITMQ_URL="amqp://guest:guest@localhost:5672/"
export RABBITMQ_QUEUE="reminders.due"- Create Reminders: Navigate to
/newto create a new reminder - Select Timezone: Choose from 20+ predefined timezones
- Pick Date/Time: Use the modern datetime picker for precise scheduling
- Set Reminder Time: Configure how many minutes before the event to be reminded
- View Upcoming: See all pending reminders on the main dashboard
Create a reminder programmatically:
curl -X POST http://localhost:8080/jobs \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "title=Team Meeting" \
-d "tz=Europe/Istanbul" \
-d "run_at=2025-09-06T14:30:00" \
-d "remind_before_minutes=15"Configure using environment variables:
# Server configuration
export ADDR=":8080" # Server address
export SQLITE_PATH="app.db" # SQLite database path
# RabbitMQ configuration (optional)
export RABBITMQ_URL="amqp://guest:guest@localhost:5672/"
export RABBITMQ_QUEUE="reminders.due"
# Timing wheel configuration (optional)
export WHEEL_TICK="1s" # Tick duration
export WHEEL_SLOTS="512" # Number of slotsThe core of TickTockBox is a custom timing wheel implementation:
// Create a timing wheel with 1-second ticks and 512 slots
wheel := twheel.New(1*time.Second, 512)
wheel.Start()
// Schedule a task
id := wheel.AfterFunc(5*time.Minute, func() {
fmt.Println("Reminder fired!")
})
// Cancel if needed
wheel.Cancel(id)- 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
This project is licensed under the MIT License - see the LICENSE file for details.
For issues and questions:
- Create an issue on GitHub
- Check the code documentation
- Review application logs for debugging