# Carry Your Live - Project Summary ## Overview A minimalist, offline-first task management app built with Expo, React Native, and WatermelonDB. Features three primary screens: To-Do List, Add New Task, and Calendar with bottom navigation. ## Core Features - **Offline-First Architecture**: Full CRUD operations work offline with WatermelonDB + SQLite - **Auto-Sync**: Background synchronization with custom Postgres API when online - **Cross-Platform**: iOS, Android, and Web from single codebase ## Tech Stack | Layer | Technology | |-------|------------| | Framework | Expo (React Native) | | Language | TypeScript | | Navigation | Expo Router (file-based) | | Database | WatermelonDB + SQLite | | State | WatermelonDB (reactive queries, no Redux needed) | | Forms | React Hook Form + Zod validation | | UI Components | React Native Paper + Custom SVG icons | | Animations | React Native Reanimated | | Date/Time | @react-native-community/datetimepicker + date-fns | | Build | Gradle (local APK) | | CI/CD | Gitea Actions | ## Project Structure ``` carry-your-live/ ├ app/ │ ├── _layout.tsx # Root layout + DatabaseProvider │ ├── (tabs)/ │ │ ├── _layout.tsx # Bottom tab navigator │ │ ├── index.tsx # Tasks screen │ │ ├── calendar.tsx # Calendar screen │ │ └── settings.tsx # Settings screen │ └── add-task.tsx # Add Task screen ├ src/ │ ├── components/ # Reusable UI components │ ├── database/ │ │ ├── schema.ts # WatermelonDB schema │ │ ├── index.ts # Database instance + collections │ │ └── sync.ts # Custom API sync adapter │ ├── models/ │ │ ├── Task.ts │ │ ├── Category.ts │ │ └── Subtask.ts │ ├── hooks/ │ │ ├── useDatabase.tsx # Database context & providers │ │ └── useTasks.tsx # Task queries with reactive state │ ├── constants/ │ │ └── index.ts # Categories, priorities, colors │ └── types/ │ └── index.ts # TypeScript interfaces ``` ## Data Models - **Task**: id, title, description, categoryId, priority, completed, dueDate, dueTime, createdAt, updatedAt, subtasks - **Category**: id, name, color, order - **Subtask**: id, taskId, title, completed, order, createdAt, updatedAt ## Default Categories | Name | Color | Order | |------|-------|-------| | Work | #E53935 (Red) | 0 | | Personal | #43A047 (Green) | 1 | | School | #1E88E5 (Blue) | 2 | | Shopping | #FB8C00 (Orange) | 3 | | Health | #8E24AA (Purple) | 4 | | Finance | #FDD835 (Yellow) | 5 | ## Priority Colors | Priority | Color | |----------|-------| | None | #9E9E9E | | Low | #43A047 | | Medium | #FB8C00 | | High | #E53935 | | Critical | #B71C1C | ## Sync API Custom API at `http://localhost:3000/api` (configurable in `src/database/sync.ts`): - **Pull**: GET /sync?since={timestamp} - returns categories, tasks, subtasks, timestamp - **Push**: POST /sync/push - body with changes { categories, tasks, subtasks } + lastPulledAt ## Getting Started ```bash npm install npx expo start # Platform-specific: npx expo start --ios npx expo start --android npx expo start --web ``` ## Build Commands - `cd android && ./gradlew assembleDebug` - Debug APK - `cd android && ./gradlew assembleRelease` - Release APK - `npm run desktop` - Electron desktop app