Skip to content
PaulBunchPublic

About

One-shot Linux reminders that survive reboot and show up as desktop notifications

Topics

Resources

Stars

17 stars

Watchers

1 watching

Forks

Latest commit

 

History

71 Commits

Folders and files

Repository files navigation

rmd

GitHub release Crates.io License: MIT

A lightweight, reliable reminder daemon and CLI for Linux.

Set one-shot reminders that survive reboots and show up as desktop notifications.

Philosophy: rmd is not a task manager. It is a zero-friction, hard-interrupt system designed to protect your flow state—reserving push notifications strictly for urgent, time-bound events (like food on the stove or an immediate meeting). Read the full Design Vision.

rmd CLI usage example

Features

  • Simple CLI: rmd +25m Tea is ready
  • Background daemon (auto-started by CLI or managed via systemd)
  • Persistent storage (~/.local/state/rmd/reminders.json)
  • Missed reminders handling (grouped notification when the system was offline)

Requirements

  • Linux (x86_64 or aarch64)
  • A D-Bus notification daemon (e.g., Fnott, Mako, Dunst, SwayNC, or DE built-in)

Installation

Prebuilt Binary (Recommended)

Downloads the pre-compiled static musl binary and enables the systemd user service:

curl -sSfL https://github.com/PaulBunch/rmd/releases/latest/download/rmd-linux-x86_64.tar.gz | tar -xz
install -Dm755 rmd ~/.local/bin/rmd
install -Dm644 rmd.service ~/.config/systemd/user/rmd.service
systemctl --user daemon-reload
systemctl --user enable --now rmd.service

ARM64 / AArch64: Replace x86_64 with aarch64 in the URL above.

If rmd is not found, add ~/.local/bin to PATH and re-login.

From crates.io

Requires Rust 1.85+.

cargo install rmd-cli

If rmd is not found, add ~/.cargo/bin to PATH and re-login.

Note: The CLI auto-spawns the background daemon on any command. However, to ensure scheduled reminders trigger after a reboot before you open a terminal, install and enable the systemd unit:

mkdir -p ~/.config/systemd/user
curl -sSL https://raw.githubusercontent.com/PaulBunch/rmd/main/extra/rmd.service -o ~/.config/systemd/user/rmd.service
systemctl --user daemon-reload
systemctl --user enable --now rmd.service

Building from Source (Requires Rust 1.85+)

Using Makefile

Builds the release binary, installs it to ~/.local/bin/, enables and immediately starts the systemd user service:

make install

To uninstall:

make uninstall

Manual Build

cargo build --release
install -Dm755 target/release/rmd ~/.local/bin/rmd
install -Dm644 extra/rmd.service ~/.config/systemd/user/rmd.service
systemctl --user daemon-reload
systemctl --user enable --now rmd.service

Usage

Time syntax

# Relative duration (+ prefix optional, spaces allowed)
rmd 45s Push the tempo
rmd +10m Check the oven
rmd 1h 30m Call mom

# Relative days & weekdays (spaced or git-style @)
rmd today 18:30 Game over
rmd tomorrow 15:00 Join release call
rmd tomorrow@10:00 Standup meeting
rmd fri 22:00 Shut up and go to bed

# Absolute time & ISO / full dates
rmd 18:30 Evening standup
rmd 2026-8-10 9:00 Doctor appointment
rmd 2026-12-01@10:00 VPS domain renewal

# --- Inspection & Listing ---

# List nearest active reminders (top N based on config)
rmd
# or override limit:
rmd ls 10

# Show specific subsets (supports optional limit N)
rmd active [n]       # Active reminders (alias: act)
rmd history [n]      # Missed & Triggered (alias: hist)
rmd missed [n]       # Only Missed reminders (alias: msd)
rmd triggered [n]    # Only Triggered reminders (alias: trg)
rmd log [n]          # Full chronological list (aliases: all, everything)

# View detailed info for specific reminder(s)
rmd 3
rmd 1 2 5
rmd 1:5            # Range of active reminders (1, 2, 3, 4, 5)
rmd h10-15         # Range of history reminders (h10, h11, h12, h13, h14, h15)
# or: rmd info 1 2 5
# or: rmd info 5:10 18 3

# --- Management & Cleanup ---

# Purge finished and missed reminders from history (interactive confirmation)
rmd clean
rmd clean -y         # Skip confirmation prompt

# Remove specific reminders by ID
rmd rm 3
rmd rm 1 2 5 -y      # Skip confirmation prompt
rmd rm 5-10 18 3     # Range and individual IDs mixed
rmd rm h1:h5         # Remove history reminders in range

Tip: Quotes around date/time or message are optional. rmd tomorrow 15:00 Call mom and rmd "tomorrow 15:00" "Call mom" work identically.

Daemon Management

The daemon runs in the background, maintaining timers and dispatching notifications.

  • Systemd Service (Recommended): Enabling rmd.service ensures the daemon starts automatically on boot/login, so scheduled reminders fire even if you haven't opened a terminal.
  • CLI Auto-Start: If the daemon is not running when you issue any rmd command, the CLI will automatically spawn it in the background as a fallback.

To manually run the daemon in the foreground:

rmd daemon

To stop the running daemon:

rmd stop

To view logs when running via systemd:

journalctl --user -u rmd.service -f

How it works

  • CLI communicates with the background daemon over a Unix domain socket
  • Daemon retains reminders in memory and persists state to disk (atomic JSON writes)
  • When a reminder triggers, a desktop notification is dispatched via D-Bus
  • On startup, the daemon checks for and handles any missed reminders

Sleep & Suspend Limitation

rmd is a lightweight daemon that relies on the system being awake to trigger notifications. If your computer is suspended (asleep) when a reminder is scheduled:

  1. The daemon is frozen and cannot send the notification at the exact time.
  2. Upon resume, the daemon detects the missed reminder.
  3. The notification is sent immediately but marked as "Missed".

For reliable delivery when the machine is asleep, ensure the system stays awake or use an external D-Bus relay/bridge that handles off-system delivery.

Configuration & Paths

View current settings and active configuration file location:

rmd config show

Manage options via CLI:

rmd config time-format human                   # Set display time format (human, iso)
rmd config limit 10                            # Set default active reminders limit
rmd config default-time 11:00                  # Set default time for date-only specs
rmd config dbus-service org.example.MyBridge   # Set custom D-Bus notification target
rmd config reset                               # Reset configuration to default values

File Locations

Configuration file:

$XDG_CONFIG_HOME/rmd/config.json
# (falls back to ~/.config/rmd/config.json)

State storage:

$XDG_STATE_HOME/rmd/reminders.json
# (falls back to ~/.local/state/rmd/reminders.json)

Runtime socket:

$XDG_RUNTIME_DIR/rmd.sock
# (falls back to /tmp/rmd.sock)

License

MIT


Downloads:

x86_64 aarch64 crates.io

About

One-shot Linux reminders that survive reboot and show up as desktop notifications

Topics

Resources

Stars

17 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Contributors

Languages