3.5 KiB
3.5 KiB
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
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 APKcd android && ./gradlew assembleRelease- Release APKnpm run desktop- Electron desktop app