A command-line reminder app that watches your markdown todo list and notifies you 8 hours before scheduled tasks.
- 📝 Markdown-based - Write tasks in simple markdown format
- 🔔 Desktop Notifications - Native Linux notifications via
notify-send - 🔊 Sound Alerts - Multiple sound fallbacks for different systems
- 📂 File Watching - Automatically detects changes to your todo file
- 💾 Persistent State - Remembers triggered reminders across restarts
- 🚀 Autostart - Optional auto-start on login (Arch Linux)
- 🕐 Timezone Support - Configurable timezone for accurate scheduling
# Build from source
git clone <repository-url>
cd go-reminder
go build -o go-reminder .
# Install to PATH
sudo cp go-reminder /usr/local/bin/go-reminder --version
go-reminder helpCreate a markdown file (e.g., ~/todos.md):
# My Tasks
- [ ] Morning standup @2026-03-11 09:00
- [ ] Submit report @2026-03-11 17:00
- [ ] Team meeting @2026-03-12 14:00Format: - [ ] Task description @YYYY-MM-DD HH:MM
# Set your todo file
go-reminder config set ~/todos.md
# Set your timezone
go-reminder timezone set Asia/Jakarta
# (Optional) Enable autostart on login
go-reminder autostart enablego-reminder startThat's it! The app will watch your file and notify you 8 hours before each task.
go-reminder [command]
Commands:
start Start watching reminders (uses configured file)
start <file.md> Start watching a specific markdown file
config Show current configuration
config set <file.md> Set the markdown file path
timezone Show current timezone
timezone set <timezone> Set timezone (e.g., UTC, America/New_York)
autostart enable Enable autostart on login (Arch Linux)
autostart disable Disable autostart
state Show triggered reminders count
state clear Clear all trigger state
help, --help, -h Show help
--version Show version
# Start with default configured file
go-reminder start
# Start with a specific file
go-reminder start /path/to/tasks.md
# Change timezone
go-reminder timezone set Europe/Berlin
# Check configuration
go-reminder config
# Clear trigger history (allows reminders to trigger again)
go-reminder state clear
# Disable autostart
go-reminder autostart disableConfiguration is stored in ~/.config/go-reminder/config.json
{
"markdown_file": "/home/user/todos.md",
"timezone": "Asia/Jakarta",
"autostart": true
}- File Watching - Monitors your markdown file for changes using
fsnotify - Periodic Checks - Scans for triggers every 30 seconds
- Trigger Window - Activates 8 hours before scheduled time
- Notifications - Sends desktop notification + plays sound
- State Persistence - Saves triggered state to prevent duplicates
- Auto-Cleanup - Removes old trigger state after 24 hours
- Linux (tested on Arch Linux)
- Go 1.25+ (for building)
notify-send(libnotify) - Desktop notificationszenity- Fallback notificationspaplay(PulseAudio) - Sound playbackaplay(ALSA) - Fallback soundbeep- PC speaker fallback
Install on Arch Linux:
sudo pacman -S libnotify zenity pulseaudio-alsa# Any markdown file
## Section headers work fine
- [ ] Task one @2026-03-11 10:00
- [x] Completed tasks are also parsed @2026-03-11 11:00
- [ ] Task with spaces @2026-03-12 15:30
### Notes
- Empty task names are ignored
- Invalid dates are skipped with a warning
- Both [ ] and [x] checkboxes are parsedCheck if sound files exist:
ls /usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.ogaTest sound manually:
paplay /usr/share/sounds/freedesktop/stereo/alarm-clock-elapsed.ogaTest notify-send:
notify-send "Test" "This is a test notification"Clear the state:
go-reminder state clear- Ensure your desktop environment supports
.desktopfiles - Check the desktop file:
cat ~/.config/autostart/go-reminder.desktop - Verify the binary path is correct
Ensure the path is absolute:
go-reminder config set /home/user/todos.mdgo build -o go-reminder .go test -v ./...go test -cover ./...go-reminder/
├── main.go # Main application logic
├── config.go # Configuration management
├── state.go # Persistent trigger state
├── main_test.go # Unit tests
├── go.mod # Go module file
└── README.md # This file
MIT License - See LICENSE file for details.
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests:
go test -v ./... - Submit a pull request
See CHANGELOG for version history.
For issues and feature requests, please open an issue on the repository.
Built with ❤️ using Go