A mobile client for org-agenda-api - access and manage your Emacs org-mode tasks from Android and iOS.
Mova is a React Native/Expo application that connects to an org-agenda-api server, providing a native mobile interface for:
- Viewing your daily agenda with scheduled items and deadlines
- Capturing new tasks using org-mode capture templates
- Searching across all your TODO items
- Running custom agenda views
- Receiving notifications for upcoming tasks
Mova is the mobile frontend for org-agenda-api, a JSON HTTP API that exposes org-mode data from GNU Emacs. The architecture:
+--------+ +----------------+ +-------+
| Mova | <---> | org-agenda-api | <---> | Emacs |
| (this) | HTTP | (server) | elisp | |
+--------+ +----------------+ +-------+
- org-agenda-api runs as a Docker container or server, exposing your org files via REST endpoints
- Mova connects to that server using HTTP Basic Auth to provide a native mobile experience
You need a running org-agenda-api instance for Mova to connect to. See the org-agenda-api README for setup instructions.
- Daily agenda with date navigation
- Shows scheduled items, deadlines, and overdue tasks
- Pull-to-refresh synchronization
- Inline task completion and editing
- Template-based task capture using your org-mode capture templates
- Dynamic form fields (text, dates, tags) defined by templates
- Priority and TODO state selection
- Scheduled/deadline date pickers
- Remembers your last-used template
- Full-text search across all TODO items
- Searches title, tags, and TODO state
- Real-time filtering
- Access your custom org-agenda commands
- Dynamic view rendering from server-defined views
- Quick Capture widget for home screen
- Capture tasks without opening the app
- Configurable template per widget instance
- Background sync for upcoming tasks
- Configurable notification intervals
- Scheduled and deadline reminders
- Node.js 18+
- Yarn or npm
- A running org-agenda-api server
- For development: Android Studio (Android) or Xcode (iOS)
# Clone the repository
git clone <repo-url>
cd mova
# Install dependencies
yarn install
# Start the development server
yarn start# Android
yarn android
# iOS
yarn ios
# Or use Expo Go for quick testing
npx expo start- Launch Mova
- Enter your org-agenda-api server URL (e.g.,
https://your-server.com) - Enter your username and password
- Tap Login
mova/
├── app/ # Expo Router screens
│ ├── (tabs)/ # Main tab navigation
│ │ ├── index.tsx # Agenda screen
│ │ ├── capture.tsx # Capture screen
│ │ ├── search.tsx # Search screen
│ │ ├── views.tsx # Custom views
│ │ └── settings/ # Settings screens
│ └── login.tsx # Login screen
├── services/ # API client and background tasks
│ ├── api.ts # org-agenda-api client
│ ├── backgroundSync.ts # Background task registration
│ └── notifications.ts # Push notifications
├── components/ # Reusable UI components
├── context/ # React context providers
├── hooks/ # Custom React hooks
├── widgets/ # Android widget implementation
└── tests/ # Jest unit/integration tests
yarn start # Start Expo dev server
yarn android # Run on Android
yarn ios # Run on iOS
yarn test # Run Jest tests
yarn typecheck # TypeScript validation
yarn lint # ESLint check
yarn e2e:android # Run Detox E2E tests# Unit tests
yarn test
# E2E tests (requires Android emulator)
yarn e2e:build:android
yarn e2e:android- React Native + Expo - Cross-platform mobile framework
- Expo Router - File-based navigation
- React Native Paper - Material Design 3 components
- TypeScript - Type safety
- Jest + Detox - Testing
Capture templates are defined in your Emacs org-mode configuration and exposed via the org-agenda-api /capture-templates endpoint. Mova automatically fetches and renders forms based on your template definitions.
Example template structure from org-agenda-api:
{
"todo": {
"name": "Todo",
"prompts": [
{ "name": "title", "type": "string", "required": true },
{ "name": "scheduled", "type": "date", "required": false },
{ "name": "tags", "type": "tags", "required": false }
]
}
}Configure notification preferences in Settings:
- Enable/disable notifications
- Set reminder intervals (e.g., 15 minutes before)
- Background sync frequency (default: 15 minutes)
GPL v3