{"id":44380084,"url":"https://github.com/bro3886/rem","last_synced_at":"2026-04-12T19:03:07.239Z","repository":{"id":337895344,"uuid":"1153026233","full_name":"BRO3886/rem","owner":"BRO3886","description":"A powerful CLI tool for macOS Reminders app","archived":false,"fork":false,"pushed_at":"2026-02-28T14:27:23.000Z","size":321,"stargazers_count":16,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-28T17:43:37.190Z","etag":null,"topics":["cli","eventkit","go","macos","reminders"],"latest_commit_sha":null,"homepage":"https://rem.sidv.dev","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/BRO3886.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-08T19:39:03.000Z","updated_at":"2026-02-28T14:27:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/BRO3886/rem","commit_stats":null,"previous_names":["bro3886/rem"],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/BRO3886/rem","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BRO3886%2Frem","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BRO3886%2Frem/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BRO3886%2Frem/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BRO3886%2Frem/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BRO3886","download_url":"https://codeload.github.com/BRO3886/rem/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BRO3886%2Frem/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30078400,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-04T08:01:56.766Z","status":"ssl_error","status_checked_at":"2026-03-04T08:00:42.919Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","eventkit","go","macos","reminders"],"created_at":"2026-02-11T22:53:19.155Z","updated_at":"2026-04-12T19:03:07.225Z","avatar_url":"https://github.com/BRO3886.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rem\n\nA blazing fast CLI for macOS Reminders. Sub-200ms reads AND writes via EventKit, natural language dates, and import/export — all in a single binary.\n\n**[Documentation](https://rem.sidv.dev)** | **[Architecture](https://rem.sidv.dev/docs/architecture/)** | **[go-eventkit](https://github.com/BRO3886/go-eventkit)**\n\n## Features\n\n- **Sub-200ms reads AND writes** — EventKit via cgo (go-eventkit), direct memory access, no IPC\n- **Single binary** — EventKit compiled in via cgo, no helper processes\n- **Natural language dates** — `tomorrow`, `next friday at 2pm`, `in 3 hours`, `eod`\n- **20 commands** — full CRUD, search, stats, overdue, upcoming, interactive mode\n- **Multiple output formats** — table, JSON, plain text\n- **Import/Export** — JSON and CSV with full property round-trip\n- **Powered by [go-eventkit](https://github.com/BRO3886/go-eventkit)** — use the same library directly for programmatic Go access\n- **Shell completions** — bash, zsh, fish\n\n## Installation\n\n### Quick install (recommended)\n\n```bash\ncurl -fsSL https://rem.sidv.dev/install | bash\n```\n\nDownloads the latest release, extracts, and installs to `/usr/local/bin`.\n\n### Via Go\n\n```bash\ngo install github.com/BRO3886/rem/cmd/rem@latest\n```\n\nRequires Go 1.21+ and Xcode Command Line Tools (cgo compiles EventKit bindings).\n\n### Manual download\n\nDownload from [GitHub Releases](https://github.com/BRO3886/rem/releases):\n\n```bash\n# Apple Silicon\ncurl -LO https://github.com/BRO3886/rem/releases/latest/download/rem-darwin-arm64.tar.gz\ntar xzf rem-darwin-arm64.tar.gz\nsudo mv rem /usr/local/bin/rem\n\n# Intel\ncurl -LO https://github.com/BRO3886/rem/releases/latest/download/rem-darwin-amd64.tar.gz\ntar xzf rem-darwin-amd64.tar.gz\nsudo mv rem /usr/local/bin/rem\n```\n\n### Build from source\n\n```bash\ngit clone https://github.com/BRO3886/rem.git\ncd rem\nmake build\n# Binary is at ./bin/rem\n```\n\n## Requirements\n\n- macOS 10.12+ (uses EventKit for all reads and writes via go-eventkit, AppleScript only for flagged operations)\n- Xcode Command Line Tools (for building from source — cgo/clang + framework headers)\n- First run will prompt for Reminders app access in System Settings \u003e Privacy \u0026 Security\n\n## Quick Start\n\n```bash\n# List all reminder lists\nrem lists --count\n\n# Create a reminder with an alarm\nrem add \"Buy groceries\" --list Personal --due tomorrow --priority high --remind-me 15m\n\n# List incomplete reminders\nrem list --list Work --incomplete\n\n# Search reminders\nrem search \"meeting\"\n\n# Show reminder details\nrem show \u003cid\u003e\n\n# Complete a reminder\nrem complete \u003cid\u003e\n\n# Show statistics\nrem stats\n```\n\n## Commands\n\n### Reminders\n\n```bash\n# Create\nrem add \"Title\" [--list LIST] [--due DATE] [--priority high|medium|low] [--notes TEXT] [--url URL] [--flagged] [--remind-me DURATION] [--repeat PATTERN]\nrem add -i                          # Interactive creation\n\n# List\nrem list [--list LIST] [--incomplete] [--completed] [--flagged] [--due-before DATE] [--due-after DATE] [-o json|table|plain]\nrem ls                              # Alias\n\n# Show\nrem show \u003cid\u003e                       # Full or partial ID\nrem get \u003cid\u003e -o json\n\n# Update\nrem update \u003cid\u003e [--name TEXT] [--due DATE] [--priority LEVEL] [--notes TEXT] [--url URL] [--remind-me DURATION] [--repeat PATTERN] [--list LIST]\n\n# Complete / Uncomplete\nrem complete \u003cid\u003e\nrem done \u003cid\u003e                       # Alias\nrem uncomplete \u003cid\u003e\n\n# Flag / Unflag\nrem flag \u003cid\u003e\nrem unflag \u003cid\u003e\n\n# Delete (supports multiple IDs)\nrem delete \u003cid\u003e [id2 id3...]        # Asks for confirmation\nrem rm \u003cid\u003e --force                 # Skip confirmation (--yes / -y also work)\n\n# Today — due and overdue reminders\nrem today\n```\n\n### Lists\n\n```bash\n# View all lists\nrem lists\nrem lists --count                   # Show reminder counts\n\n# Create a list\nrem list-mgmt create \"My List\"\nrem lm new \"Shopping\"               # Alias\n\n# Rename a list\nrem list-mgmt rename \"Old Name\" \"New Name\"\n\n# Delete a list\nrem list-mgmt delete \"Name\"         # Asks for confirmation\nrem lm rm \"Name\" --force\n```\n\n### Search \u0026 Analytics\n\n```bash\nrem search \"query\" [--list LIST] [--incomplete]\nrem stats                           # Overall statistics\nrem overdue                         # Overdue reminders\nrem upcoming [--days 7]             # Upcoming due dates\n```\n\n### Import / Export\n\n```bash\n# Export\nrem export --list Work --format json \u003e work.json\nrem export --format csv --output-file reminders.csv\nrem export --incomplete --format json\n\n# Import\nrem import work.json\nrem import reminders.csv --list \"Imported\"\nrem import --dry-run data.json      # Preview without creating\n```\n\n### Interactive Mode\n\n```bash\nrem interactive                     # Full interactive menu\nrem i                               # Alias\nrem add -i                          # Interactive add\n```\n\n### Output Formats\n\nAll list/show commands support `--output` (`-o`):\n\n```bash\nrem list -o table                   # Default, formatted table\nrem list -o json                    # Machine-readable JSON\nrem list -o plain                   # Simple text\nrem list -o json | jq '.[].name'   # Pipe to jq\n```\n\nColor output respects `NO_COLOR`:\n```bash\nNO_COLOR=1 rem list\nrem list --no-color\n```\n\n### AI Agent Skills\n\n```bash\nrem skills install                 # Interactive picker\nrem skills install --agent claude  # Claude Code only\nrem skills install --agent all     # All supported agents\nrem skills status                  # Check installation status\nrem skills uninstall               # Remove the skill\n```\n\n### Shell Completions\n\n```bash\n# Bash\nrem completion bash \u003e /usr/local/etc/bash_completion.d/rem\n\n# Zsh\nrem completion zsh \u003e \"${fpath[1]}/_rem\"\n\n# Fish\nrem completion fish \u003e ~/.config/fish/completions/rem.fish\n```\n\n## Date Parsing\n\nDate parsing is powered by [`go-eventkit/dateparser`](https://github.com/BRO3886/go-eventkit):\n\n| Input | Meaning |\n|-------|---------|\n| `now` | Current date and time |\n| `today` | Today at 9:00 AM |\n| `tomorrow` | Tomorrow at 9:00 AM |\n| `next monday` | Next Monday at 9:00 AM |\n| `monday 2pm` | Next Monday at 2:00 PM |\n| `next friday at 2pm` | Next Friday at 2:00 PM |\n| `in 2 days` | 2 days from now |\n| `in 3 hours` | 3 hours from now |\n| `5 days ago` | 5 days before now |\n| `eod` / `end of day` | Today at 5:00 PM |\n| `this week` | End of current week |\n| `next week` | Next Monday at 9:00 AM |\n| `next month` | 1st of next month at 9:00 AM |\n| `mar 15` | March 15 at 9:00 AM |\n| `5pm` | Today (or tomorrow) at 5:00 PM |\n| `today 5pm` | Today at 5:00 PM |\n| `2026-02-15` | February 15, 2026 |\n| `2026-02-15 14:30` | February 15, 2026 at 2:30 PM |\n\n## Go API\n\nrem is powered by [**go-eventkit**](https://github.com/BRO3886/go-eventkit) — use it directly for programmatic access to macOS Reminders in your own Go programs:\n\n```bash\ngo get github.com/BRO3886/go-eventkit\n```\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"time\"\n\n    \"github.com/BRO3886/go-eventkit/reminders\"\n)\n\nfunc main() {\n    client, err := reminders.New()\n    if err != nil {\n        panic(err)\n    }\n\n    // Create a reminder\n    due := time.Now().Add(24 * time.Hour)\n    r, err := client.CreateReminder(reminders.CreateReminderInput{\n        Title:    \"Buy groceries\",\n        ListName: \"Personal\",\n        DueDate:  \u0026due,\n        Priority: reminders.PriorityHigh,\n    })\n    if err != nil {\n        panic(err)\n    }\n    fmt.Println(\"Created:\", r.ID)\n\n    // List incomplete reminders\n    items, _ := client.Reminders(\n        reminders.WithList(\"Personal\"),\n        reminders.WithCompleted(false),\n    )\n    for _, item := range items {\n        fmt.Printf(\"- %s (due: %v)\\n\", item.Title, item.DueDate)\n    }\n\n    // Complete a reminder\n    client.CompleteReminder(r.ID)\n\n    // Get all lists\n    lists, _ := client.Lists()\n    for _, l := range lists {\n        fmt.Printf(\"%s (%d reminders)\\n\", l.Title, l.Count)\n    }\n}\n```\n\nSee the [go-eventkit README](https://github.com/BRO3886/go-eventkit) for the full API reference.\n\n## Architecture\n\n```\nrem/\n├── cmd/rem/              # CLI entry point\n│   ├── main.go\n│   └── commands/         # Cobra command definitions\n├── internal/\n│   ├── service/          # Service layer wrapping go-eventkit (AppleScript only for flagged ops)\n│   ├── reminder/         # Domain models (Reminder, List, Priority)\n│   ├── export/           # JSON \u0026 CSV import/export\n│   ├── skills/           # Agent skill install/uninstall/status\n│   ├── update/           # Background update check (GitHub releases)\n│   └── ui/               # Table formatting, colored output\n├── skills/rem-cli/       # Embedded agent skill files\n├── website/              # Hugo documentation site\n├── Makefile\n├── LICENSE\n└── README.md\n```\n\n**All reads and writes** — including reminder CRUD and list CRUD — go through `go-eventkit` (`github.com/BRO3886/go-eventkit`) — an Objective-C EventKit bridge compiled into the binary via cgo. Direct in-process access to the Reminders store, no IPC. All operations complete in under 200ms.\n\n**Flagged operations** use AppleScript via `osascript` — EventKit doesn't expose the flagged property. Default list name query also uses AppleScript.\n\n## Performance\n\nTested with 224 reminders across 12 lists:\n\n| Command | Time |\n|---------|------|\n| `rem lists` | 0.12s |\n| `rem list` (all 224) | 0.13s |\n| `rem show` (by prefix) | 0.11s |\n| `rem search` | 0.11s |\n| `rem stats` | 0.17s |\n\nSee [Performance docs](https://rem.sidv.dev/docs/performance/) for the full optimization story (JXA at 60s → EventKit at 0.13s).\n\n## Known Limitations\n\n- **macOS only** — requires EventKit framework and osascript\n- **No tags/subtasks** — not exposed via EventKit\n- **`--flagged` filter is slow** (~3-4s) — EventKit doesn't expose `flagged`, falls back to JXA\n- **Immutable lists** cannot be renamed or deleted (system lists like Siri suggestions)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbro3886%2Frem","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbro3886%2Frem","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbro3886%2Frem/lists"}