{"id":27648330,"url":"https://github.com/colonelpanic8/mova","last_synced_at":"2026-02-07T03:03:21.999Z","repository":{"id":271131668,"uuid":"911864618","full_name":"colonelpanic8/mova","owner":"colonelpanic8","description":"Mobile org-mode via API","archived":false,"fork":false,"pushed_at":"2026-02-05T01:29:20.000Z","size":19305,"stargazers_count":7,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-05T13:50:04.597Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/colonelpanic8.png","metadata":{"files":{"readme":"README.org","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"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":"2025-01-04T03:43:25.000Z","updated_at":"2026-02-05T01:29:14.000Z","dependencies_parsed_at":"2025-10-16T17:31:59.356Z","dependency_job_id":"f6b60cae-957e-4b8a-99f2-3e0a6f6dcabd","html_url":"https://github.com/colonelpanic8/mova","commit_stats":null,"previous_names":["colonelpanic8/mova"],"tags_count":83,"template":false,"template_full_name":null,"purl":"pkg:github/colonelpanic8/mova","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/colonelpanic8%2Fmova","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/colonelpanic8%2Fmova/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/colonelpanic8%2Fmova/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/colonelpanic8%2Fmova/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/colonelpanic8","download_url":"https://codeload.github.com/colonelpanic8/mova/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/colonelpanic8%2Fmova/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29185116,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-07T00:44:15.062Z","status":"online","status_checked_at":"2026-02-07T02:00:07.217Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2025-04-24T02:38:38.521Z","updated_at":"2026-02-07T03:03:21.994Z","avatar_url":"https://github.com/colonelpanic8.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"* Mova\n:PROPERTIES:\n:CUSTOM_ID: mova\n:END:\nA mobile client for [[https://github.com/colonelpanic8/org-agenda-api][org-agenda-api]] - access and manage your Emacs org-mode tasks from Android and iOS.\n\n** Overview\n:PROPERTIES:\n:CUSTOM_ID: overview\n:END:\nMova is a React Native/Expo application that connects to an org-agenda-api server, providing a native mobile interface for:\n\n- Viewing your daily agenda with scheduled items and deadlines\n- Capturing new tasks using org-mode capture templates\n- Searching across all your TODO items\n- Running custom agenda views\n- Receiving notifications for upcoming tasks\n\n** Relationship to org-agenda-api\n:PROPERTIES:\n:CUSTOM_ID: relationship-to-org-agenda-api\n:END:\nMova is the mobile frontend for [[https://github.com/colonelpanic8/org-agenda-api][org-agenda-api]], a JSON HTTP API that exposes org-mode data from GNU Emacs. The architecture:\n\n#+begin_src mermaid :file architecture.png\nflowchart TB\n    subgraph Docker[\"Docker Container\"]\n        nginx[\"nginx\u003cbr/\u003e(HTTP Basic Auth)\"]\n        subgraph Emacs\n            httpd[\"simple-httpd\u003cbr/\u003e(HTTP server)\"]\n            api[\"org-agenda-api\u003cbr/\u003e(elisp)\"]\n            org[\"org-mode\"]\n            httpd --\u003e api --\u003e org\n        end\n        repo[\"Git Repository\u003cbr/\u003e(.org files on disk)\"]\n        sync[\"git-sync-rs\"]\n        nginx --\u003e httpd\n        org \u003c--\u003e repo\n        sync \u003c--\u003e repo\n    end\n    remote[\"Remote Git\"]\n    mova[\"Mova\u003cbr/\u003e(this app)\"]\n\n    sync \u003c--\u003e remote\n    mova \u003c--\u003e|HTTP/JSON| nginx\n#+end_src\n\n#+RESULTS:\n[[file:architecture.png]]\n\n- *nginx* handles HTTP Basic Auth and proxies requests to Emacs\n- *simple-httpd* provides the HTTP server functionality within Emacs\n- *org-agenda-api* is an elisp package that runs inside Emacs, translating org-mode data into JSON HTTP responses\n- *org-mode* reads and writes =.org= files from the git repository on disk\n- *git-sync-rs* keeps the local git repository synchronized with a remote\n- *Mova* connects to nginx via HTTP Basic Auth to provide a native mobile experience\n\nYou need a running org-agenda-api instance for Mova to connect to. See the [[https://github.com/colonelpanic8/org-agenda-api][org-agenda-api README]] for setup instructions.\n\n** Features\n:PROPERTIES:\n:CUSTOM_ID: features\n:END:\n*** Agenda View\n:PROPERTIES:\n:CUSTOM_ID: agenda-view\n:END:\n- Daily agenda with date navigation\n- Shows scheduled items, deadlines, and overdue tasks\n- Pull-to-refresh synchronization\n- Inline task completion and editing\n\n*** Capture\n:PROPERTIES:\n:CUSTOM_ID: capture\n:END:\n- Template-based task capture using your org-mode capture templates\n- Dynamic form fields (text, dates, tags) defined by templates\n- Priority and TODO state selection\n- Scheduled/deadline date pickers\n- Remembers your last-used template\n\n*** Search\n:PROPERTIES:\n:CUSTOM_ID: search\n:END:\n- Full-text search across all TODO items\n- Searches title, tags, and TODO state\n- Real-time filtering\n\n*** Custom Views\n:PROPERTIES:\n:CUSTOM_ID: custom-views\n:END:\n- Access your custom org-agenda commands\n- Dynamic view rendering from server-defined views\n\n*** Android Widget\n:PROPERTIES:\n:CUSTOM_ID: android-widget\n:END:\n- Quick Capture widget for home screen\n- Capture tasks without opening the app\n- Configurable template per widget instance\n\n*** Notifications\n:PROPERTIES:\n:CUSTOM_ID: notifications\n:END:\n- Background sync for upcoming tasks\n- Configurable notification intervals\n- Scheduled and deadline reminders\n\n** Getting Started\n:PROPERTIES:\n:CUSTOM_ID: getting-started\n:END:\n*** Prerequisites\n:PROPERTIES:\n:CUSTOM_ID: prerequisites\n:END:\n- Node.js 18+\n- Yarn or npm\n- A running [[https://github.com/colonelpanic8/org-agenda-api][org-agenda-api]] server\n- For development: Android Studio (Android) or Xcode (iOS)\n\n*** Installation\n:PROPERTIES:\n:CUSTOM_ID: installation\n:END:\n#+begin_src sh\n# Clone the repository\ngit clone https://github.com/colonelpanic8/mova\ncd mova\n\n# Install dependencies\nyarn install\n\n# Start the development server\nyarn start\n#+end_src\n\n*** Running the App\n:PROPERTIES:\n:CUSTOM_ID: running-the-app\n:END:\n#+begin_src sh\n# Android\nyarn android\n\n# iOS\nyarn ios\n\n# Or use Expo Go for quick testing\nnpx expo start\n#+end_src\n\n*** Connecting to org-agenda-api\n:PROPERTIES:\n:CUSTOM_ID: connecting-to-org-agenda-api\n:END:\n1. Launch Mova\n2. Enter your org-agenda-api server URL (e.g., =https://your-server.com=)\n3. Enter your username and password\n4. Tap Login\n\n** Development\n:PROPERTIES:\n:CUSTOM_ID: development\n:END:\n*** Project Structure\n:PROPERTIES:\n:CUSTOM_ID: project-structure\n:END:\n#+begin_example\nmova/\n├── app/                    # Expo Router screens\n│   ├── (tabs)/             # Main tab navigation\n│   │   ├── index.tsx       # Agenda screen\n│   │   ├── capture.tsx     # Capture screen\n│   │   ├── search.tsx      # Search screen\n│   │   ├── views.tsx       # Custom views\n│   │   └── settings/       # Settings screens\n│   └── login.tsx           # Login screen\n├── services/               # API client and background tasks\n│   ├── api.ts              # org-agenda-api client\n│   ├── backgroundSync.ts   # Background task registration\n│   └── notifications.ts    # Push notifications\n├── components/             # Reusable UI components\n├── context/                # React context providers\n├── hooks/                  # Custom React hooks\n├── widgets/                # Android widget implementation\n└── tests/                  # Jest unit/integration tests\n#+end_example\n\n*** Commands\n:PROPERTIES:\n:CUSTOM_ID: commands\n:END:\n#+begin_src sh\nyarn start          # Start Expo dev server\nyarn android        # Run on Android\nyarn ios            # Run on iOS\nyarn test           # Run Jest tests\nyarn typecheck      # TypeScript validation\nyarn lint           # ESLint check\nyarn e2e:android    # Run Detox E2E tests\n#+end_src\n\n*** Testing\n:PROPERTIES:\n:CUSTOM_ID: testing\n:END:\n#+begin_src sh\n# Unit tests\nyarn test\n\n# E2E tests (requires Android emulator)\nyarn e2e:build:android\nyarn e2e:android\n#+end_src\n\n** Tech Stack\n:PROPERTIES:\n:CUSTOM_ID: tech-stack\n:END:\n- *React Native* + *Expo* - Cross-platform mobile framework\n- *Expo Router* - File-based navigation\n- *React Native Paper* - Material Design 3 components\n- *TypeScript* - Type safety\n- *Jest* + *Detox* - Testing\n\n** Configuration\n:PROPERTIES:\n:CUSTOM_ID: configuration\n:END:\n*** Capture Templates\n:PROPERTIES:\n:CUSTOM_ID: capture-templates\n:END:\nCapture 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.\n\nExample template structure from org-agenda-api:\n\n#+begin_src json\n{\n  \"todo\": {\n    \"name\": \"Todo\",\n    \"prompts\": [\n      { \"name\": \"title\", \"type\": \"string\", \"required\": true },\n      { \"name\": \"scheduled\", \"type\": \"date\", \"required\": false },\n      { \"name\": \"tags\", \"type\": \"tags\", \"required\": false }\n    ]\n  }\n}\n#+end_src\n\n*** Notifications\n:PROPERTIES:\n:CUSTOM_ID: notifications-1\n:END:\nConfigure notification preferences in Settings:\n\n- Enable/disable notifications\n- Set reminder intervals (e.g., 15 minutes before)\n- Background sync frequency (default: 15 minutes)\n\n** License\n:PROPERTIES:\n:CUSTOM_ID: license\n:END:\nGPL v3\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcolonelpanic8%2Fmova","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcolonelpanic8%2Fmova","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcolonelpanic8%2Fmova/lists"}