Lightweight cross-platform reminder daemon for developers
Project description
kim — keep in mind 🧠
Lightweight cross-platform reminder daemon for developers.
No UI. Config-driven. Runs in the background.
Documentation: https://pratikwayal01.github.io/kim/
Install
Linux / macOS
curl -fsSL https://raw.githubusercontent.com/pratikwayal01/kim/main/install.sh | bash
Windows (PowerShell as Admin)
powershell -ExecutionPolicy Bypass -c "irm https://raw.githubusercontent.com/pratikwayal01/kim/main/install.ps1 | iex"
That's it. kim starts automatically on login.
Usage
kim start Start the daemon
kim stop Stop the daemon
kim status Show running reminders
kim list List all reminders from config
kim logs Tail the log file
kim edit Open config in $EDITOR
kim add Add a new reminder
kim remove Remove a reminder
kim enable Enable a reminder
kim disable Disable a reminder
kim update Update a reminder
kim remind Fire a one-shot reminder after a delay
kim interactive Enter interactive mode (-i)
kim self-update Check for and install updates
kim uninstall Uninstall kim completely
kim export Export reminders to file
kim import Import reminders from file
kim validate Validate config file
kim slack Slack notification settings
kim completion Generate shell completions
kim sound # show current config + format notes
kim sound --set ~/sounds/bell.mp3 # set custom file (validates on set)
kim sound --clear # revert to system default
kim sound --test # play it immediately
kim sound --enable / --disable # toggle sound on/off
One-shot reminders
kim remind "standup call" in 10m
kim remind "take a break" in 1h
kim remind "check the oven" in 25m
kim remind "deploy window opens" in 2h 30m
Fires once, runs in the background, frees your terminal immediately.
Persistent — one-shot reminders survive daemon restarts and system reboots. Stored in ~/.kim/oneshots.json and loaded automatically when the daemon starts. Expired reminders are cleaned up on next startup.
Config — ~/.kim/config.json
{
"reminders": [
{
"name": "eye-break",
"interval": "30m",
"title": "👁️ Eye Break",
"message": "Look 20 feet away for 20 seconds. Blink slowly.",
"urgency": "critical",
"enabled": true
},
{
"name": "water",
"interval": "1h",
"title": "💧 Drink Water",
"message": "Stay hydrated.",
"urgency": "normal",
"enabled": true
}
],
"sound": true
}
| Field | Values | Description |
|---|---|---|
name |
string | Unique identifier |
interval |
number or string ("30m", "1h", "1d") |
How often to fire |
title |
string | Notification heading |
message |
string | Notification body |
urgency |
low / normal / critical |
Notification priority |
enabled |
true / false |
Toggle without deleting |
sound |
true / false |
(top-level) Play sound globally |
slack |
object | (top-level) Slack settings |
Per-Reminder Overrides
Each reminder can override global sound and Slack settings:
{
"reminders": [
{
"name": "standup",
"interval": "30m",
"sound_file": "~/sounds/urgent.wav",
"slack": {
"enabled": true,
"webhook_url": "https://hooks.slack.com/services/...",
"channel": "#standup-alerts"
}
}
],
"sound": true,
"slack": {
"enabled": true,
"webhook_url": "https://hooks.slack.com/services/...",
"channel": "#general"
}
}
Or via CLI:
kim add standup -I 30m --sound-file ~/sounds/urgent.wav --slack-channel "#standup"
Slack Integration
{
"reminders": [...],
"sound": true,
"slack": {
"enabled": true,
"webhook_url": "https://hooks.slack.com/services/your-webhook-id",
"bot_token": "xoxb-your-bot-token",
"channel": "#general"
}
}
Use a Webhook or a Bot Token — not both. Test with kim slack --test.
How it works
| Platform | Autostart | Notifications |
|---|---|---|
| Linux | systemd user service | notify-send |
| macOS | launchd agent | osascript |
| Windows | Task Scheduler | PowerShell toast |
- Pure Python stdlib — no pip installs
- Zero config — works out of the box, creates default config on first run
- All reminders run on a single
heapqscheduler thread — memory stays flat (~0.02 MB) regardless of how many reminders you have - Logs at
~/.kim/kim.log, PID at~/.kim/kim.pid
Why kim?
| Tool | Pure stdlib | CLI-first | Zero config | One-shot | Recurring | Cross-platform | Slack | Config-driven | Interactive | Self-update | Export/Import |
|---|---|---|---|---|---|---|---|---|---|---|---|
| kim | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Remind | ❌ | ✅ | ✅ | ✅ | ✅ | ⚠️ | ❌ | ⚠️ | ❌ | ❌ | ❌ |
| Cron | ✅ | ✅ | ❌ | ⚠️ | ✅ | ⚠️ | ❌ | ✅ | ❌ | ❌ | ⚠️ |
| macOS Reminders | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Google Calendar | ❌ | ❌ | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ⚠️ |
Uninstall
kim uninstall
Start small. Keep it in mind.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kim_reminder-4.0.0.tar.gz.
File metadata
- Download URL: kim_reminder-4.0.0.tar.gz
- Upload date:
- Size: 48.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86126fa81f6df9b556864539b448cf7dc3128659b40ca4cb8484e08f1932335f
|
|
| MD5 |
fec34ff11a3edd2efc64983fd33f7e79
|
|
| BLAKE2b-256 |
8d3a50822ff47439a1e07bcda83339e689b750cf31cff54d85ddc50470eb754b
|
File details
Details for the file kim_reminder-4.0.0-py3-none-any.whl.
File metadata
- Download URL: kim_reminder-4.0.0-py3-none-any.whl
- Upload date:
- Size: 43.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3adb087b277b8f83b8753468697663f3a03dd8084c7e833a6ff7714cdde59195
|
|
| MD5 |
f91a84450accdfeebc1146abd9719024
|
|
| BLAKE2b-256 |
bdf0cf1d82ba533c2e37e1736fcf2063e3d1262b98c41ef4ba399405642a49c1
|