A modern, real-time todo application built with Expo, React Native, Convex backend, and Clerk authentication. Features a clean, Notion-inspired design with secure user authentication and real-time data synchronization.
- 🔐 Secure Authentication - Email/password authentication with Clerk
- 🔄 Real-time Sync - Instant updates across all devices with Convex
- 📱 Cross-Platform - Works on iOS, Android, and Web
- 🎨 Clean UI - Notion-inspired design with smooth interactions
- 👤 User Profiles - Personal todo lists for each user
- ⚡ Fast & Responsive - Optimized performance with React Native
- Frontend: Expo, React Native, TypeScript
- Backend: Convex (serverless, real-time database)
- Authentication: Clerk
- Navigation: Expo Router
- Icons: Lucide React Native
- Node.js 18+
- npm or yarn
- Expo CLI
- iOS Simulator (Mac) or Android Emulator
-
Clone the repository
git clone <repository-url> cd <project-directory>
-
Install dependencies
npm install
-
Set up environment variables
cp .env.example .env.local
Then edit
.env.localwith your credentials (see SETUP.md for detailed instructions) -
Set up Convex
npx convex dev
-
Start the app
npm run dev
- Sign up at clerk.com
- Create new application → Select "Expo" framework
⚠️ CRITICAL: Set up JWT Template- Go to Configure → JWT Templates
- Click "+ New template"
- Select "Convex" from the list
- Name: Must be exactly
convex - Click Create
- Get your keys:
- Go to API Keys tab
- Copy Publishable key (starts with
pk_test_) - Note your Frontend API URL (e.g.,
https://your-app.clerk.accounts.dev)
- Sign up at convex.dev
- Create new project
⚠️ CRITICAL: Set Clerk domain in Convex- In Convex dashboard → Settings → Environment Variables
- Add variable:
CLERK_JWT_ISSUER_DOMAIN - Value: Your Clerk Frontend API URL (from step 1.4)
- Initialize Convex:
npx convex dev
- Select your project
- This creates
.env.localwith your Convex URL
Create/update .env.local file with:
# Clerk - Get from clerk.com → Your App → API Keys
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_YOUR_KEY_HERE
# Convex - Auto-filled by 'npx convex dev'
EXPO_PUBLIC_CONVEX_URL=https://YOUR_PROJECT.convex.cloud# Deploy Convex functions
npx convex deploy
# Start the app
npm run dev🚨 Common Setup Issues:
- JWT template MUST be named exactly
convex(case-sensitive) - Environment variables MUST start with
EXPO_PUBLIC_for Expo - Clerk domain in Convex MUST match your Frontend API URL exactly
- Run
npx convex deployafter any schema changes
For detailed setup instructions, see SETUP.md.
├── app/ # Expo Router pages
│ ├── (auth)/ # Authentication screens
│ ├── (tabs)/ # Main app tabs
│ └── providers/ # Context providers
├── components/ # Reusable UI components
├── convex/ # Backend functions and schema
│ ├── schema.ts # Database schema
│ ├── todos.ts # Todo CRUD operations
│ └── users.ts # User management
├── hooks/ # Custom React hooks
└── assets/ # Images and fonts
Create a .env.local file with:
# Clerk
EXPO_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
# Convex
EXPO_PUBLIC_CONVEX_URL=https://...convex.cloudnpm run dev # Start Expo development server
npm run build:web # Build for web platform
npm run lint # Run ESLint
npx convex dev # Start Convex development
npx convex deploy # Deploy Convex functions- Email/password sign up and sign in
- Email verification for new accounts
- Secure session management
- Protected routes
- Create, read, update, delete todos
- Mark todos as complete/incomplete
- Filter by status (all, active, completed)
- Real-time updates across devices
- View account information
- Sign out functionality
- User-specific todo lists
- JWT-based authentication with Clerk
- Row-level security in Convex
- Secure token storage with Expo SecureStore
- Environment variables for sensitive data
Contributions are welcome! Please feel free to submit a Pull Request.
This project is open source and available under the MIT License.
For issues and questions:
- Check SETUP.md for setup help
- Review the Convex docs
- Review the Clerk docs
- Open an issue on GitHub