A fast, beautiful Terminal User Interface (TUI) for Apple Reminders built with a modern Swift wrapper + Rust core architecture. Rem provides a keyboard-driven interface to view, navigate, and manage your Apple Reminders directly from the terminal with native macOS integration.
- ๐ Lightning Fast: Native EventKit integration eliminates AppleScript delays (18+ seconds โ <1 second)
- ๐ฑ Real Apple Reminders Data: Direct integration with macOS Reminders app
- โจ๏ธ Vim-style Navigation: Intuitive keyboard shortcuts (j/k, arrow keys)
- ๐จ Beautiful UI: Modern terminal interface with colors, emojis, and rounded borders
- โ Full Management: Create, toggle, delete reminders with comprehensive form interface
- ๐ Live Data: Real-time access to your actual reminders and lists
- ๐ก๏ธ Native Permissions: Automatic permission handling with native macOS dialogs
- ๐๏ธ Modern Architecture: Type-safe Swift-Rust communication via UniFFI
- ๐ Rich Creation: Create reminders with title, notes, due dates, lists, and priorities
โโโโโโโโโโโโโโโโโโโโ ๐ Your Reminder Lists โโโโโโโโโโโโโโโโโโโโ
โ โ
โ โถ โ Today โ
โ 9306 reminders โ
โ โ
โ โ House โ
โ 51 reminders โ
โ โ
โ โ Our Things โ
โ 12 reminders โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโ Controls โโโโโโโโโโโโโโโโโโโโโโโโโ
โ โโ or j/k navigate โ select c create q quit โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Rem uses a modern Swift wrapper + Rust core architecture that separates system integration from TUI logic:
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Swift Wrapper โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ RemindersServiceโ โ PermissionManager โ โ
โ โ (EventKit) โ โ (Native Dialogs) โ โ
โ โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ UniFFI Bridge โ
โ (Type-Safe Rust โ Swift) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Rust Core โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Ratatui TUI Engine โ โ
โ โ โโโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ Lists โ โReminders โ โ Navigation โ โ โ
โ โ โComponent โ โComponent โ โ & Events โ โ โ
โ โ โโโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Apple Reminders โ
โ (macOS App) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- Swift Entry Point: Handles permissions and loads data via native EventKit
- Native Integration: Fast, reliable access to Reminders data
- UniFFI Bridge: Type-safe data conversion between Swift and Rust
- Rust TUI: High-performance terminal interface and user interaction
- Action Processing: Swift receives actions and updates data accordingly
RemTUI/ # New Architecture
โโโ RemTUIKit/ # Swift Package (System Integration)
โ โโโ Package.swift
โ โโโ Sources/RemTUIKit/
โ โ โโโ RemindersService.swift # Native EventKit wrapper
โ โ โโโ PermissionManager.swift # Native permission handling
โ โ โโโ [Generated UniFFI files] # Rust bindings
โ โโโ Tests/RemTUIKitTests/
โโโ rust-core/ # Rust Library (TUI Core)
โ โโโ Cargo.toml
โ โโโ src/
โ โ โโโ lib.rs # UniFFI exports
โ โ โโโ rem_core.udl # Interface definition
โ โ โโโ tui/ # Ratatui implementation
โ โ โโโ app.rs # Main TUI application
โ โ โโโ components.rs # UI components
โ โ โโโ events.rs # Event handling
โโโ RemTUI/ # Swift Executable
โ โโโ Package.swift
โ โโโ Sources/main.swift # Application entry point
โ โโโ Info.plist # Permissions & metadata
โโโ build.sh # Build coordination script
โโโ test-migration.sh # Validation script
โโโ Makefile # Development workflow
โโโ MIGRATION.md # Architecture migration guide
โโโ DEVELOPMENT.md # Feature development guide
โโโ ARCHITECTURE.md # Detailed architecture documentation
- macOS 14.0+ (required for full EventKit access)
- Rust 1.70+ with Cargo
- Swift 5.9+ with Package Manager
- Xcode Command Line Tools
# Clone the repository
git clone https://github.com/yourusername/rem.git
cd rem
# Build everything with UniFFI bindings
make build
# Run the application
make run
# Install with development tools
make install-dev
# Run tests
make test
# Run with debug logging
make debug
# Start the application (full build + run)
make run
# Run without rebuilding (preserves UniFFI checksums - recommended)
make run-direct
# Run directly:
cd RemTUI && .build/release/RemTUI
# Run with debug output
make debug
# Run development version
make dev
Note: Use
make run-direct
to avoid UniFFI checksum issues when the TUI integration is already built. This builds only the Swift executable without regenerating Rust bindings.
Lists View:
j
/k
orโ
/โ
- Navigate between listsEnter
- Open selected listc
- Create new reminderq
- Quit application
Reminders View:
j
/k
orโ
/โ
- Navigate between remindersSpace
orEnter
- Toggle reminder completiondd
orDelete
- Delete selected reminder (vim-style)c
- Create new reminderq
orEsc
- Go back to lists
Create Reminder Form:
Tab
- Navigate between form fieldsโ
/โ
- Change list/priority selectionsCtrl+S
- Save and create reminderq
orEsc
- Cancel and return
Form Fields:
- Title - Text input for reminder title (required)
- Notes - Multi-line text input for notes
- Date - Due date in ISO8601 format (e.g., 2024-12-31T23:59:59Z)
- List - Select target reminder list
- Priority - Set priority level (0-9, where 0 = none)
On first run, Rem will automatically request permission to access your Reminders using native macOS dialogs. No manual setup required!
# Setup development environment
make setup
# Build components individually
make build-rust # Build Rust core only
make build-uniffi # Build Rust + generate UniFFI bindings
make build-swift # Build Swift package only
make build # Build everything
# Running
make run # Full build + run
make run-direct # Run without rebuilding (preserves checksums)
make run-debug # Run in debug mode
# Development
make dev-swift # Watch Swift files only (preserves checksums)
make fix-checksums # Fix UniFFI checksums after rebuild
# Development and testing
make dev # Run in development mode
make test # Run all tests
make test-rust # Test Rust core only
make test-swift # Test Swift package only
# Code quality
make fmt # Format all code
make lint # Run linters
make check # Check compilation without building
# Debugging
make debug # Run with debug logging
make debug-rust # Debug Rust components
make debug-swift # Debug Swift components
# Cleanup
make clean # Clean build artifacts
make clean-all # Clean everything including dependencies
RemindersService.swift
- Native EventKit integration for fast data access
- Concurrent list and reminder loading
- Real-time permission status monitoring
- Error handling with detailed context
PermissionManager.swift
- Native permission request dialogs
- Status checking and guidance
- Automatic permission flow handling
lib.rs - UniFFI exports and main interface tui/app.rs - Core TUI application logic with Ratatui rem_core.udl - UniFFI interface definition for type safety
build.sh - Coordinates Rust compilation and UniFFI binding generation Makefile - Complete development workflow automation test-migration.sh - Validates architecture and compilation
Metric | Before (AppleScript) | After (Native EventKit) |
---|---|---|
Cold Start | 18+ seconds | <1 second |
List Loading | 2-3 seconds | <500ms |
Reminder Fetch | 1-2 seconds/list | <200ms/list |
Permission Setup | Manual guidance | Automatic native dialogs |
# Run all tests
make test
# Test individual components
make test-rust # Rust core tests
make test-swift # Swift package tests
make test-integration # Integration tests
# Validate migration
make test-migration # Architecture validation
# Performance benchmarks
make benchmark # Performance comparison tests
The most common issue is "UniFFI API checksum mismatch" when rebuilding:
# Use run-direct to avoid regenerating bindings
make run-direct
# If checksums are out of sync, clean rebuild:
make clean-all
make build
# Then manually update checksums in RemCore.swift if needed
Why this happens: UniFFI generates checksums to ensure the Rust library matches the Swift bindings. When rebuilding, the checksums may change, requiring manual updates in the generated Swift file.
The new architecture handles permissions automatically, but if you encounter issues:
# Check permission status
make check-permissions
# Reset permissions (if needed)
tccutil reset Reminders
# Debug permission flow
make debug-permissions
# Clean and rebuild everything
make clean-all
make build
# Check individual components
make check-rust # Rust compilation check
make check-swift # Swift compilation check
# Debug build process
make debug-build
# Profile the application
make profile
# Debug with detailed logging
make debug
# Check system requirements
make check-system
The new architecture enables exciting possibilities:
- ๐ Calendar Integration: Events alongside reminders
- ๐ Real-time Sync: Live updates with iCloud synchronization
- ๐ท๏ธ Advanced Filtering: Tag-based and smart list filtering
- ๐ Rich Editing: In-place reminder editing and creation
- ๐ฏ Bulk Operations: Multi-select actions and batch operations
- ๐ Analytics: Productivity insights and completion tracking
We welcome contributions! The new architecture makes it easy to contribute to specific layers:
- Swift Layer: EventKit integration, native macOS features, permissions
- Rust Core: TUI components, user experience, performance optimizations
- Documentation: Guides, examples, architecture explanations
# Fork and clone
git clone https://github.com/yourusername/rem.git
cd rem
# Setup development environment
make setup
# Run tests to ensure everything works
make test
# Create feature branch
git checkout -b feature/amazing-feature
# Make changes and test
make dev
make test
# Submit pull request
See DEVELOPMENT.md for a comprehensive guide on adding functionality through all layers of the architecture, including:
- Step-by-step feature implementation
- UniFFI integration patterns
- Key handling and TUI updates
- Swift backend services
- Testing strategies
The development guide uses the delete functionality (dd
command) as a complete example of implementing features from Rust TUI to Swift EventKit integration.
- Swift: Follow Swift API Design Guidelines
- Rust: Use
cargo fmt
and passcargo clippy
- Documentation: Update relevant docs in
docs/
- Tests: Add tests for new functionality
This project is licensed under the MIT License - see the LICENSE file for details.
- Ratatui - Excellent TUI framework for Rust
- UniFFI - Type-safe FFI between Rust and Swift
- Apple EventKit - Native Reminders integration
- Rust Community - Amazing ecosystem and documentation
- Swift Package Manager - Modern dependency management
Migration Note: This version represents a complete architectural upgrade from the previous Rust-only implementation. See MIGRATION.md for detailed migration information and performance comparisons.