Catatan Sync — Obsidian Mobile Client
Cross-platform mobile and web client for Obsidian notes with zero local persistence — all content streams directly from the Catatan Sync API with real-time collaboration.
The Android client for the api-catatan service — an Expo / React Native app for reading, searching and (for the owner) writing an Obsidian vault. It stores nothing on the device: no local database, no direct MongoDB connection, everything through the REST API that already exists.
📱 Android Application Build
The latest Android build is installable directly through Expo:
👉 Install Catatan Android App on Expo
Highlights
- A deliberately stateless client — no on-device store to fall out of sync and no credentials to leak, because every read and write is an API call. The trade-off is honest: without a network there is nothing to show.
- One screen, two identities — signing in as the owner does not open a separate admin area; it changes what the same screen renders. Private notes become readable and locked folders appear with their counts. The write buttons hang off the
pemilikflag in the server response, and the server independently enforces it throughverifyAdmin, so hiding a button is presentation, not security. - Shared notes without an account — open by code or link, exchange a password for a 12-hour token, and let content and the presence list refresh over long-polling.
- Conflicts are offered, never silently overwritten — collaborative editing runs behind a revision guard, so two people editing the same note get a choice instead of one losing their work.
- Three layers, one direction — screens → hooks (TanStack Query) → api (axios). Screens never call axios, the api layer never imports React, and
src/types/api.tsis the single source of truth for data shapes on both sides. - Expo Go cannot run it, and that is documented up front — Play Store Expo Go is SDK 54 while this project is SDK 57, so on-device testing means an EAS-built APK. Release builds target
arm64-v8aonly, with minification and resource shrinking enabled.
Key Features
- Folder explorer — breadcrumb navigation that turns into search results as soon as you start typing, with autocomplete suggestions and extension filtering.
- Reader — markdown with tappable Obsidian wikilinks,
.txtas plain text, keyword highlighting, plus copy and share. - Owner editing — create, edit and delete notes; full folder management including create, rename, lock and unlock, reorder, and delete.
- Deep links — verified HTTPS app links pointing at the
api-catatanhost, so a shared note URL opens in the app rather than the browser. - Over-the-air updates —
expo-updatesships fixes without a new store build. - Session storage in SecureStore — the owner session lives in encrypted device storage, never in plain preferences.
Tech Stack
- Expo SDK 57 + React Native, Expo Router
- TypeScript, with
tsc --noEmitas the type gate - TanStack Query (server state) + axios (transport)
- react-hook-form + zod (form validation)
- expo-secure-store (session), expo-updates (OTA)
- @shopify/flash-list, react-native-reanimated, react-native-marked
- Jest (18 test files)
- EAS Build (Android APK, arm64-v8a)
Status & Maturity
Active. Day-to-day development runs on --web, where search, folders, the reader and the admin surface all work; only Share, Alert and the document picker genuinely require a real APK to verify. A single npm run dev:full command boots the real api-catatan backend, detects the machine's LAN IP, and points the app at it — a detail that matters because a phone cannot reach the development machine's localhost. File import is deliberately absent here and stays in the web panel.
Measured Metrics
| Commits | 18 |
| Date Range | 10 Aug 2026 – 13 Aug 2026 |
| Lines of code | 26,521 |
| Tests | 18 Jest test files |