-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Welcome to the kim wiki! fix this remove claude
Lightweight cross-platform reminder daemon for developers. No UI. Config-driven. Runs in the background.
- Overview
- How It Works
- Installation
- Uninstallation
- CLI Reference
- Configuration
- Slack Integration
- Building from Source
- Releasing Binaries
- Troubleshooting
- Roadmap
KIM is a developer-focused reminder daemon that runs quietly in the background and fires desktop notifications at configured intervals. It is built entirely on the Python standard library β no pip dependencies required β and supports Linux, macOS, and Windows out of the box.
Key design principles:
- No GUI, no Electron, no bloat
- Single config file (
~/.kim/config.json) - Autostart on login via native OS mechanisms
- Each reminder runs in its own thread
| Platform | Autostart Mechanism | Notification Method |
|---|---|---|
| Linux | systemd user service | notify-send |
| macOS | launchd agent | osascript |
| Windows | Task Scheduler | PowerShell toast |
KIM can send reminders to a Slack channel in addition to desktop notifications.
{
"reminders": [...],
"sound": true,
"slack": {
"enabled": true,
"webhook_url": "https://hooks.slack.com/services/...",
"bot_token": "xoxb-...",
"channel": "#general"
}
}
Webhook (simpler): Create an incoming webhook at https://api.slack.com/messaging/webhooks and paste the URL into webhook_url.
Bot Token (more control): Create a Slack app, add the chat:write scope, install it to your workspace, and paste the bot token into bot_token.
You only need one method β use whichever fits your setup.
kim slack --test
kim stop && kim start
KIM uses PyInstaller to produce self-contained binaries. Since PyInstaller cannot cross-compile, each platform's binary must be built on the matching OS.
pip install pyinstaller
pyinstaller --onefile --name kim kim.py
# Output: ./dist/kim (or ./dist/kim.exe on Windows)
Add .github/workflows/build.yml to your repo:
name: Build & Attach Binaries
on:
workflow_dispatch:
inputs:
tag:
description: "Release tag to attach binaries to (e.g. v1.0.0)"
required: true
default: "v1.0.0"
permissions:
contents: write
jobs:
build:
strategy:
matrix:
include:
- os: ubuntu-latest
artifact: kim-linux
- os: macos-latest
artifact: kim-macos
- os: windows-latest
artifact: kim-windows.exe
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install PyInstaller
run: pip install pyinstaller
- name: Build binary
run: pyinstaller --onefile --name ${{ matrix.artifact }} kim.py
- name: Upload to release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release upload ${{ inputs.tag }} dist/${{ matrix.artifact }} --clobber
To trigger: go to Actions β Build & Attach Binaries β Run workflow, enter your tag (e.g. v1.0.0), and click Run. All three binaries will be built in parallel and uploaded to the release.
Important: The
permissions: contents: writeblock is required. Without it, the default GitHub token cannot upload release assets and the workflow will fail with HTTP 403.
-
Create and push a tag:
git tag v1.0.0 git push origin v1.0.0 -
Create a GitHub Release for the tag (via GitHub UI or
gh release create v1.0.0). -
Trigger the Build & Attach Binaries workflow from the Actions tab with the matching tag.
-
Once complete, the release will have three assets:
kim-linux,kim-macos,kim-windows.exe.
Check the log file for errors:
kim logs
Make sure there isn't already a stale PID file:
rm ~/.kim/kim.pid
kim start
Grant notification permissions to Terminal (or whichever app you run KIM from) in System Settings β Notifications.
Ensure notify-send is installed:
sudo apt install libnotify-bin # Debian/Ubuntu
sudo dnf install libnotify # Fedora
KIM reads config only on startup. Always restart after editing:
kim stop && kim start
kim validate
- One-shot reminders (
kim remind "standup" in 10m) - Per-reminder cron-style scheduling (not just fixed intervals)
- Plugin system for custom notification channels
- Additional webhook integrations (Teams, Discord, etc.)
Start small. Keep it in mind.
# KIM β Keep In Mind π§Lightweight cross-platform reminder daemon for developers. No UI. Config-driven. Runs in the background.
- [Overview](#overview)
- [How It Works](#how-it-works)
- [Installation](#installation)
- [Uninstallation](#uninstallation)
- [CLI Reference](#cli-reference)
- [Configuration](#configuration)
- [Slack Integration](#slack-integration)
- [Building from Source](#building-from-source)
- [Releasing Binaries](#releasing-binaries)
- [Troubleshooting](#troubleshooting)
- [Roadmap](#roadmap)
KIM is a developer-focused reminder daemon that runs quietly in the background and fires desktop notifications at configured intervals. It is built entirely on the Python standard library β no pip dependencies required β and supports Linux, macOS, and Windows out of the box.
Key design principles:
- No GUI, no Electron, no bloat
- Single config file (
~/.kim/config.json) - Autostart on login via native OS mechanisms
- Each reminder runs in its own thread
| Platform | Autostart Mechanism | Notification Method |
|---|---|---|
| Linux | systemd user service | notify-send |
| macOS | launchd agent | osascript |
| Windows | Task Scheduler | PowerShell toast |
- The daemon tracks its process ID at
~/.kim/kim.pid - Logs are written to
~/.kim/kim.log - Each reminder runs independently in its own thread, so one slow/failed reminder never blocks others
curl -fsSL https://raw.githubusercontent.com/pratikwayal01/kim/main/install.sh | bashpowershell -ExecutionPolicy Bypass -c "irm https://raw.githubusercontent.com/pratikwayal01/kim/main/install.ps1 | iex"The installer will:
- Copy
kimto~/.local/bin/(Linux/macOS) or a PATH-accessible location (Windows) - Register an autostart entry so KIM launches on login
- Start the daemon immediately
Note: On macOS, you may be prompted to allow notifications for Terminal or
osascriptthe first time a reminder fires.
kim uninstallsystemctl --user disable --now kim.service
rm ~/.config/systemd/user/kim.service
rm -rf ~/.kim ~/.local/bin/kimlaunchctl unload ~/Library/LaunchAgents/io.kim.reminder.plist
rm ~/Library/LaunchAgents/io.kim.reminder.plist
rm -rf ~/.kim ~/.local/bin/kimUnregister-ScheduledTask -TaskName KimReminder -Confirm:$false
Remove-Item -Recurse "$env:USERPROFILE\.kim"| Command | Description |
|---|---|
kim start |
Start the daemon |
kim stop |
Stop the daemon |
kim status |
Show running reminders and daemon status |
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 interactive |
Enter interactive mode |
kim self-update |
Check for and install the latest version |
kim uninstall |
Remove KIM completely from the system |
kim export |
Export reminders to a file |
kim import |
Import reminders from a file |
kim validate |
Validate the config file |
kim slack |
Manage Slack notification settings |
kim completion |
Generate shell completions |
After editing the config, always restart the daemon to apply changes:
kim stop && kim startKIM is controlled entirely by ~/.kim/config.json. You can edit it directly (kim edit) or manage it through CLI commands.
{
"reminders": [
{
"name": "eye-break",
"interval_minutes": 30,
"title": "ποΈ Eye Break",
"message": "Look 20 feet away for 20 seconds. Blink slowly.",
"urgency": "critical",
"enabled": true
},
{
"name": "water",
"interval_minutes": 60,
"title": "π§ Drink Water",
"message": "Stay hydrated.",
"urgency": "normal",
"enabled": true
}
],
"sound": true
}| Field | Type | Values | Description |
|---|---|---|---|
name |
string | any | Unique identifier for the reminder |
interval_minutes |
number or string | e.g. 30, "30m", "1h", "1d"
|
How often the reminder fires |
title |
string | any | Notification heading |
message |
string | any | Notification body text |
urgency |
string |
low / normal / critical
|
Controls notification priority level |
enabled |
boolean |
true / false
|
Toggle a reminder without deleting it |
sound |
boolean |
true / false
|
(top-level) Play sound with notifications globally |
KIM can send reminders to a Slack channel in addition to desktop notifications.
{
"reminders": [...],
"sound": true,
"slack": {
"enabled": true,
"webhook_url": "https://hooks.slack.com/services/...",
"bot_token": "xoxb-...",
"channel": "#general"
}
}Webhook (simpler): Create an incoming webhook at https://api.slack.com/messaging/webhooks and paste the URL into webhook_url.
Bot Token (more control): Create a Slack app, add the chat:write scope, install it to your workspace, and paste the bot token into bot_token.
You only need one method β use whichever fits your setup.
kim slack --testkim stop && kim startKIM uses [PyInstaller](https://pyinstaller.org) to produce self-contained binaries. Since PyInstaller cannot cross-compile, each platform's binary must be built on the matching OS.
pip install pyinstaller
pyinstaller --onefile --name kim kim.py
# Output: ./dist/kim (or ./dist/kim.exe on Windows)Add .github/workflows/build.yml to your repo:
name: Build & Attach Binaries
on:
workflow_dispatch:
inputs:
tag:
description: "Release tag to attach binaries to (e.g. v1.0.0)"
required: true
default: "v1.0.0"
permissions:
contents: write
jobs:
build:
strategy:
matrix:
include:
- os: ubuntu-latest
artifact: kim-linux
- os: macos-latest
artifact: kim-macos
- os: windows-latest
artifact: kim-windows.exe
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install PyInstaller
run: pip install pyinstaller
- name: Build binary
run: pyinstaller --onefile --name ${{ matrix.artifact }} kim.py
- name: Upload to release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh release upload ${{ inputs.tag }} dist/${{ matrix.artifact }} --clobberTo trigger: go to Actions β Build & Attach Binaries β Run workflow, enter your tag (e.g. v1.0.0), and click Run. All three binaries will be built in parallel and uploaded to the release.
Important: The
permissions: contents: writeblock is required. Without it, the default GitHub token cannot upload release assets and the workflow will fail with HTTP 403.
-
Create and push a tag:
git tag v1.0.0 git push origin v1.0.0
-
Create a GitHub Release for the tag (via GitHub UI or
gh release create v1.0.0). -
Trigger the Build & Attach Binaries workflow from the Actions tab with the matching tag.
-
Once complete, the release will have three assets:
kim-linux,kim-macos,kim-windows.exe.
Check the log file for errors:
kim logsMake sure there isn't already a stale PID file:
rm ~/.kim/kim.pid
kim startGrant notification permissions to Terminal (or whichever app you run KIM from) in System Settings β Notifications.
Ensure notify-send is installed:
sudo apt install libnotify-bin # Debian/Ubuntu
sudo dnf install libnotify # FedoraKIM reads config only on startup. Always restart after editing:
kim stop && kim startkim validate- One-shot reminders (
kim remind "standup" in 10m) - Per-reminder cron-style scheduling (not just fixed intervals)
- Plugin system for custom notification channels
- Additional webhook integrations (Teams, Discord, etc.)
KIM β Keep In Mind π§ A tiny background daemon that reminds developers...