Skip to content

Releases: 83noit/remtodo

v1.3.0

17 Mar 10:45
v1.3.0
c27bda8

Choose a tag to compare

See CHANGELOG.md for details.

What's new

time: tag ↔ Apple Reminders due-time sync

The TTDL agenda tag time:HHMM is now synced with the dueDateComponents.hour/minute field on Apple Reminders.

  • Accepts both 4-digit (time:0930) and TTDL's 3-digit shorthand (time:900); normalises to 4-digit HHMM
  • Preserves end-time duration when start time changes: time:0900-1030 + new start 1000time:1000-1130
  • Follows the same writeback.due_date config flag as due date

v1.2.0

15 Mar 17:40
v1.2.0
5360cc3

Choose a tag to compare

See CHANGELOG.md for details.

v1.1.2

04 Mar 10:16
v1.1.2
9e75204

Choose a tag to compare

See CHANGELOG.md

v1.1.1

03 Mar 10:55
v1.1.1
d40feac

Choose a tag to compare

What's new

Added

  • remtodo --version / -V / version — print the version string and exit.

Fixed

  • Orphan eid: tags after Triage release: when sticky_tracking = "triage" released a task, the state entry was removed but the eid: tag was left on the task in todo.txt, producing a verify_post_sync "no state entry" warning on every subsequent sync. The fix strips eid: at release time; a one-time cleanup pass also heals tasks left in this state by the v1.1.0 run.

  • Hash mismatch warnings for untracked field changes: editing an untracked field — adding/removing a context, project, rec: tag, or any other custom tag — produced a verify_post_sync "hash mismatch" warning every cycle, and could cause an incorrect ResurrectReminder instead of DeleteTask in Case B. A hash-reconciliation pass now keeps the stored hash accurate.

See CHANGELOG.md for full details.

v1.1.0

03 Mar 10:13
v1.1.0
95868b6

Choose a tag to compare

What's changed

Changed — sticky tracking mode "auto""triage"

The old auto mode distinguished between push-origin and pull-origin tasks. Pull-origin tasks (created in Reminders, pulled into todo.txt) would only be released from Reminders if another configured list admitted them after an edit — which meant reminders persisted indefinitely for the common inbox workflow:

Reminders → todo.txt → prioritise/edit in todo.txt → filter governs

The new triage mode uses a simpler rule: any edit to a task in todo.txt is the triage signal. Once edited, the push filter is authoritative. Unedited tasks retain inbox protection regardless of origin.

Migration: replace sticky_tracking = "auto" with sticky_tracking = "triage" in your config.toml. The value "auto" is now a parse error.

Fixed — recurring tasks no longer inherit parent eid:

The spawned next instance of a recurring task was silently inheriting the parent task's eid: tag because todo_lib's cleanup_cloned_task() does not strip it. This caused the completed parent and the new instance to share the same EID, which verify_post_sync reported as a duplicate-EID warning on every subsequent sync cycle.

Full changelog

See CHANGELOG.md.

v1.0.1

28 Feb 14:11
v1.0.1
361e139

Choose a tag to compare

Changed

  • Bump dirs 5 → 6, signal-hook 0.3 → 0.4, toml 0.8 → 1.0
  • Bump actions/checkout v4 → v6 in CI

v1.0.0 — initial public release

28 Feb 12:35
v1.0.0
2c9bc46

Choose a tag to compare

Changelog

All notable changes to this project will be documented in this file.
Format follows Keep a Changelog.

[1.0.0] - 2026-02-28

Initial public release.

Sync engine

  • Bidirectional sync between Apple Reminders and todo.txt via a three-way
    diff against persisted state (state.json)
  • Last-write-wins (LWW) conflict resolution per field, with configurable
    timestamp tolerance (timestamp_tolerance_secs) to absorb iCloud rounding
  • Hash-based change detection on both sides (no spurious updates)
  • Bootstrap reconciliation by title + due date on first sync, so existing
    tasks and reminders are linked without duplication
  • EID relinking: detects iCloud external-identifier reassignment and
    re-links by content hash instead of treating it as delete + create
  • Recurrence: EventKit recurrence rules ignored on import; TTDL manages
    rec: recurrence locally and remtodo propagates completions

Sentinel eid: values

Three reserved tags let tasks opt out of sync or trigger ejection:

  • eid:na — permanent local opt-out, never pushed to Reminders
  • eid:na/<orig> — eject a synced reminder and keep task local
  • eid:ns/<orig> — eject a synced reminder and resume normal rules

Configuration

  • Per-list sync configuration: auto_context, push_filter, sticky_tracking
  • Configurable priority mapping: Reminders integers → context:NAME,
    priority:AZ, or none (default: priority 9 → @today)
  • Per-field writeback control: set false to make todo.txt authoritative
    for title, due_date, priority, or is_completed
  • Sticky tracking modes: auto (origin-aware release), always, never

Safety guards

  • Bulk-delete threshold: aborts if more than max_delete_percent (default 50%)
    of tracked reminders would be deleted in one cycle
  • First-sync protection: no deletions on the first sync for a list
  • Task-count coherence check: aborts if the output file shrinks unexpectedly
  • Post-sync consistency verification: detects duplicate EIDs and hash mismatches

Operations

  • remtodo sync — one-shot sync with optional --dry-run and --config
  • remtodo restore — reverts Reminders mutations and restores todo.txt +
    state.json from pre-sync backups
  • remtodo install / status / uninstall — launchd agent management
  • Lock file (PID-based) prevents concurrent sync runs
  • Graceful SIGINT/SIGTERM handling with per-list rollback

Infrastructure

  • Swift EventKit helper (reminders-helper) with batch create/update/delete
  • make install builds the Rust binary inside nix develop and copies both
    binaries to ~/.local/bin; Swift must be pre-built outside nix develop
  • nix flake dev environment (nix develop)
  • GitHub Actions CI: cargo fmt, cargo clippy, cargo test, swift build
  • Dependabot for Cargo and GitHub Actions updates