A feature-rich, cross-platform task management application built with React Native, Expo, and Supabase, featuring secure authentication, smart notifications, and automatic cleanup.
Zenith Task is a production-ready, cross-platform mobile application designed to help users manage their tasks efficiently across daily, weekly, and monthly categories. Built with modern technologies and best practices, the app offers a seamless experience with intelligent features like auto-delete, recurring tasks, smart notifications, and real-time cloud synchronization.
- 🎨 Beautiful UI: Modern gradient designs with smooth animations and polished interactions
- 🌓 Dark Mode: Automatic theme switching based on system preferences with manual override
- ☁️ Cloud Sync: Real-time PostgreSQL database synchronization via Supabase
- ⚡ Smart Performance: Optimized with category caching and optimistic updates
- 🔒 Secure: Row-level security (RLS) policies and Google OAuth authentication
- 📊 Intelligent Tracking: Progress stats, expiration warnings, and auto-delete system
- 🔔 Smart Notifications: Due date reminders, auto-delete warnings, and completion reminders
- ♻️ Recurring Tasks: Support for daily, weekly, and monthly recurring tasks
| Feature | Description |
|---|---|
| Category-Based Tasks | Organize tasks into Daily, Weekly, Monthly, or Others categories |
| Priority Levels | High, Medium, Low priority with visual indicators |
| Recurring Tasks | Set tasks to repeat automatically (daily/weekly/monthly) |
| Auto-Delete System | Expired tasks automatically cleaned up every 6 hours |
| Expiration Warnings | Visual badges and notifications before task deletion |
| Complete Task System | Title, description, due date, due time, and category support |
| Feature | Description |
|---|---|
| Due Date Reminders | Get notified before tasks are due |
| Auto-Delete Warnings | Warning notifications before tasks expire |
| Completion Reminders | Reminders for incomplete tasks (configurable) |
| Multiple Channels | Separate notification channels for different alert types |
| Smart Scheduling | Recurring tasks exempt from auto-delete |
| Feature | Description |
|---|---|
| Google OAuth | One-tap sign in with Google account |
| Email/Password | Traditional authentication with email verification |
| Secure Storage | AsyncStorage for session persistence |
| Row-Level Security | Database policies ensure users only see their data |
| Auto User Profiles | Automatic profile creation on first sign-in |
| Feature | Description |
|---|---|
| Adaptive Theming | Light and dark mode with system preference detection |
| Gradient Designs | Beautiful gradient backgrounds and components |
| Smooth Animations | Polished transitions and haptic feedback |
| Empty States | Friendly messages when no tasks exist |
| Responsive Layout | Optimized for different screen sizes |
| Category Badges | Visual category indicators with colors |
| Expiring Soon Tags | Yellow badges for tasks approaching deletion |
| Feature | Description |
|---|---|
| Theme Toggle | Switch between light and dark mode manually |
| Statistics Dashboard | View total, completed, and active task counts |
| Auto-Sync Toggle | Enable/disable real-time synchronization |
| Notifications Control | Enable/disable all notifications |
| Haptic Feedback | Toggle vibration feedback for interactions |
| Sound Effects | Enable/disable sound effects |
| User Feedback System | Submit bug reports and feature requests |
| Danger Zone | Clear all todos with confirmation |
|
Frontend React Native 0.81 Expo SDK 54 TypeScript 5.9 React Hooks Expo Router |
Backend Supabase PostgreSQL Database Row-Level Security Real-time Subscriptions RESTful API |
Authentication Supabase Auth Google OAuth 2.0 Email/Password AsyncStorage Secure Sessions |
Features Expo Notifications Haptic Feedback Linear Gradients Date/Time Pickers Modal Dialogs |
{
"react-native": "0.81.5",
"expo": "~54.0.33",
"@supabase/supabase-js": "^2.95.3",
"expo-router": "~6.0.23",
"expo-notifications": "^0.32.16",
"expo-linear-gradient": "^15.0.8",
"@react-native-async-storage/async-storage": "^2.2.0",
"@expo/vector-icons": "^15.0.3",
"expo-haptics": "~15.0.8"
}Before you begin, ensure you have the following installed:
| Tool | Version | Purpose |
|---|---|---|
| Node.js | v18+ | JavaScript runtime |
| npm/yarn | Latest | Package manager |
| Expo CLI | Latest | Expo development tools |
| EAS CLI | Latest | Building production apps |
| Git | Latest | Version control |
- Android Studio (for Android development)
- Xcode (for iOS development - macOS only)
- VS Code (recommended IDE)
git clone https://github.com/soumen0818/TO-DO-Mobile-App.git
cd TO-DO_APPnpm install
# or
yarn installThe Supabase configuration is pre-configured in eas.json for building:
{
"build": {
"production": {
"env": {
"EXPO_PUBLIC_SUPABASE_URL": "https://your-project.supabase.co",
"EXPO_PUBLIC_SUPABASE_ANON_KEY": "your-anon-key"
}
}
}
}For local development, create a .env file:
EXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
EXPO_PUBLIC_SUPABASE_ANON_KEY=your-anon-key-here- Create a Supabase project at supabase.com
- Run the SQL schema in Supabase SQL Editor:
- Copy contents from
supabase-schema.sql - Execute in your Supabase project
- Copy contents from
- Run the limits migration:
- Copy contents from
update-todo-limits-migration.sql - Execute in your Supabase project
- Copy contents from
- Configure Google OAuth:
- Go to Authentication > Providers in Supabase Dashboard
- Enable Google provider
- Add your OAuth credentials
- Add redirect URLs for your app scheme
npm start
# or
expo start# Android
npm run android
# or
expo start --android
# iOS
npm run ios
# or
expo start --ios
# Web
npm run web
# or
expo start --web- Press
rto reload the app - Press
dto open developer menu - Press
jto open debugger - Use Expo Go app for quick testing on physical devices
TO-DO_APP/
│
├── 📱 app/ # Application screens & routing
│ ├── (tabs)/ # Tab-based navigation
│ │ ├── index.tsx # 🏠 Home screen (Task list with categories)
│ │ ├── profile.tsx # 👤 User profile screen
│ │ ├── setting.tsx # ⚙️ Settings screen
│ │ └── _layout.tsx # Tab layout configuration
│ ├── _layout.tsx # Root layout with providers
│ ├── index.tsx # Splash/redirect screen
│ ├── sign-in.tsx # 🔐 Authentication screen
│ └── [...unmatched].tsx # 404 handler
│
├── 🎨 assets/ # Static assets
│ ├── images/ # App icons and images
│ │ ├── app-logo-padded.png # App icon with padding
│ │ ├── todo-app-logo.png # Main app logo
│ │ └── google-icon.png # Google OAuth icon
│ └── styles/ # StyleSheet definitions
│ ├── home.styles.ts # Home screen styles
│ └── settings.styles.ts # Settings screen styles
│
├── 🧩 components/ # Reusable React components
│ ├── Header.tsx # App header with branding
│ ├── Todoinput.tsx # Task creation modal
│ ├── EditTodoModal.tsx # Task editing modal
│ ├── TodoDetailModal.tsx # Task details view
│ ├── EmptyState.tsx # Empty list placeholder
│ ├── LoadingSpinner.tsx # Loading indicator
│ ├── ProgressStats.tsx # Statistics cards
│ ├── ExpirationNotice.tsx # Expiring tasks banner
│ ├── Toast.tsx # Toast notifications
│ ├── CustomAlert.tsx # Custom alert dialogs
│ ├── FeedbackModal.tsx # User feedback form
│ ├── Preferences.tsx # Settings preferences
│ ├── OtherSettings.tsx # Other settings options
│ └── DangerZone.tsx # Dangerous actions (clear all)
│
├── 🔐 contexts/ # React Context providers
│ ├── AuthContext.tsx # Authentication state & functions
│ └── SettingsContext.tsx # App settings & preferences
│
├── 🎯 hooks/ # Custom React hooks
│ ├── useTheme.tsx # Theme management
│ ├── useNotifications.tsx # Notification scheduling
│ ├── useAutoDelete.tsx # Auto-delete cleanup
│ └── useSupabase.tsx # Supabase data fetching
│
├── 📦 lib/ # Core library functions
│ ├── supabase.ts # Supabase client configuration
│ ├── database.types.ts # TypeScript types from Supabase
│ ├── todos.ts # Task CRUD operations
│ ├── users.ts # User operations
│ ├── feedback.ts # Feedback system
│ └── logger.ts # Logging utility
│
├── 🔧 utils/ # Utility functions
│ ├── expirationUtils.ts # Auto-delete calculation logic
│ └── notificationUtils.ts # Notification setup & permissions
│
├── 📝 docs/ # Documentation
│ ├── PRODUCTION_READINESS.md # Production checklist
│ ├── MIGRATION_SUMMARY.md # Migration notes
│ ├── SECURITY_AUDIT_SUMMARY.md # Security review
│ └── AUTO_DELETE_README.md # Auto-delete documentation
│
├── 🛡️ android/ # Android native code
│ └── app/ # Android app configuration
│
└── 📄 Configuration Files
├── app.json # Expo app configuration
├── eas.json # EAS Build configuration
├── package.json # Dependencies & scripts
├── tsconfig.json # TypeScript configuration
├── supabase-schema.sql # Database schema
└── update-todo-limits-migration.sql # Database migration
eas build --profile preview --platform androidThis creates an APK file suitable for internal testing.
eas build --profile production --platform androidThis creates an optimized APK for production release.
eas build --profile production --platform iosNote: You need an active Apple Developer account ($99/year) to build iOS apps.
All build configurations are in eas.json:
{
"build": {
"preview": {
"distribution": "internal",
"android": { "buildType": "apk" },
"env": {
"EXPO_PUBLIC_SUPABASE_URL": "https://your-project.supabase.co",
"EXPO_PUBLIC_SUPABASE_ANON_KEY": "your-anon-key"
}
},
"production": {
"autoIncrement": true,
"channel": "production",
"android": { "buildType": "apk" },
"env": {
"EXPO_PUBLIC_SUPABASE_URL": "https://your-project.supabase.co",
"EXPO_PUBLIC_SUPABASE_ANON_KEY": "your-anon-key"
}
}
}
}| Property | Value |
|---|---|
| App Name | Zenith Task |
| Package ID | com.soumen0818.zenithtask |
| Version | 1.0.0 |
| Bundle ID (iOS) | com.soumen0818.zenithtask |
| Scheme | zenith-task |
- App Icon:
./assets/images/todo-app-logo.png - Adaptive Icon: Custom foreground with #E6F4FE background
- Splash Screen: Custom logo with white/black background based on theme
- Favicon: todo-app-logo.png
Zenith Task uses Supabase for backend services, providing:
- PostgreSQL Database with Row-Level Security (RLS)
- Authentication with Google OAuth and Email/Password
- Real-time subscriptions for live updates
- Auto-generated TypeScript types
- Server-side functions and triggers
| Column | Type | Description |
|---|---|---|
id |
UUID | Primary key |
user_id |
UUID | Foreign key to users table |
title |
TEXT | Task title (required, max 200 chars) |
description |
TEXT | Task description (optional, max 1000 chars) |
is_completed |
BOOLEAN | Completion status |
due_date |
TIMESTAMPTZ | Due date (timestamp or day number) |
due_time |
TEXT | Due time in "HH:MM AM/PM" format |
priority |
TEXT | high | medium | low |
category |
TEXT | daily | weekly | monthly | null (others) |
is_recurring |
BOOLEAN | Whether task repeats |
recurring_pattern |
TEXT | Recurrence pattern |
created_at |
TIMESTAMPTZ | Creation timestamp |
updated_at |
TIMESTAMPTZ | Last update timestamp |
completed_at |
TIMESTAMPTZ | Completion timestamp |
| Column | Type | Description |
|---|---|---|
id |
UUID | Primary key (auth.uid) |
email |
TEXT | User email |
name |
TEXT | Display name |
image_url |
TEXT | Profile picture URL |
created_at |
TIMESTAMPTZ | Sign-up date |
updated_at |
TIMESTAMPTZ | Last update |
| Column | Type | Description |
|---|---|---|
id |
UUID | Primary key |
user_id |
UUID | Foreign key to users |
type |
TEXT | feature | bug |
title |
TEXT | Feedback title |
description |
TEXT | Optional details |
status |
TEXT | pending | resolved |
created_at |
TIMESTAMPTZ | Submission date |
| Function | Description |
|---|---|
getTodos(userId) |
Fetch all todos for user |
getTodosByCategory(userId, category) |
Fetch todos by category |
getTodosExpiringSoon(userId) |
Fetch tasks approaching deletion |
addTodo(todo) |
Create new todo with validation |
updateTodo(args) |
Update todo with field clearing support |
toggleTodo(id, userId) |
Toggle completion status |
deleteTodo(id, userId) |
Delete specific todo |
deleteExpiredTodos(userId) |
Delete all expired todos (auto-cleanup) |
clearAllTodos(userId) |
Delete all user todos |
getUserStats(userId) |
Get task statistics |
-- Users can only view their own todos
CREATE POLICY "Users can view their own todos"
ON public.todos FOR SELECT
USING (auth.uid() = user_id);
-- Users can only insert their own todos
CREATE POLICY "Users can insert their own todos"
ON public.todos FOR INSERT
WITH CHECK (auth.uid() = user_id);
-- Users can only update their own todos
CREATE POLICY "Users can update their own todos"
ON public.todos FOR UPDATE
USING (auth.uid() = user_id);
-- Users can only delete their own todos
CREATE POLICY "Users can delete their own todos"
ON public.todos FOR DELETE
USING (auth.uid() = user_id);-
Todo Limits Enforcement: Prevents users from exceeding category limits
- Daily: 30 todos
- Weekly: 20 todos
- Monthly: 30 todos
- Others: 50 todos
-
Feedback Rate Limiting: Maximum 2 feedback submissions per day
-
Auto Profile Creation: Automatically creates user profile on sign-up
-
Updated Timestamp: Auto-updates
updated_aton every modification
import { supabase } from "@/lib/supabase";
import { getTodos, addTodo, updateTodo } from "@/lib/todos";
// Fetch todos
const todos = await getTodos(userId);
// Create a todo
await addTodo({
userId: user.id,
title: "Buy groceries",
description: "Milk, eggs, bread",
priority: "high",
category: "daily",
dueDate: Date.now(),
dueTime: "02:30 PM",
});
// Toggle completion
await toggleTodo(todoId, userId);
// Update todo
await updateTodo({
id: todoId,
userId: user.id,
title: "Updated title",
clearDescription: true, // Removes description
});Zenith Task includes an intelligent auto-delete system that automatically removes expired tasks to keep your task list clean and focused.
- Client-Side Cleanup: Runs every 6 hours via
useAutoDeletehook - Expiration Rules (based on category):
- Daily: Expires 48 hours after end of the creation day
- Weekly: Expires 8 days after end of creation day
- Monthly: Expires 31 days after end of creation day
- Others (with due date): Expires 24 hours after due date/time
- Others (no due date): Expires 24 hours after creation
- Recurring Protection: Recurring tasks never expire
- Warning System: Shows "Expiring Soon" badge and sends notifications
// Auto-delete runs on app launch and every 6 hours
useAutoDelete(); // in app/(tabs)/index.tsx
// Expiration calculation (utils/expirationUtils.ts)
calculateExpirationTime(createdAt, category, isRecurring, dueDate, dueTime);
shouldDeleteTodo(todo); // Check if should be deleted now
isInWarningWindow(todo); // Check if expiring soonTasks are organized into four categories:
| Category | Description | Due Date Format | Limit |
|---|---|---|---|
| Daily | Daily recurring tasks | Timestamp | 30 |
| Weekly | Weekly tasks (by weekday) | 0-6 (Sun-Sat) | 20 |
| Monthly | Monthly tasks (by day) | 1-31 (day of month) | 30 |
| Others | Uncat egorized tasks | Timestamp (optional) | 50 |
Three types of notifications keep you on track:
- Scheduled 30 minutes before task due time
- Only for tasks with specific due dates
- Skipped for weekly/monthly categories
- Scheduled 12 hours before task deletion
- For tasks with due dates: Warning shows AFTER due date passes
- For tasks without due dates: Warning shows 12 hours before deletion
- Recurring tasks never receive warnings
- Configurable reminders for incomplete tasks
- Can be toggled in settings
- Reminders: Due date and completion reminders
- Auto-Delete Warnings: Expiration notices
- System: App updates and general notifications
Tasks can be set to recur automatically:
{
isRecurring: true,
recurringPattern: "daily" | "weekly" | "monthly",
category: "daily" | "weekly" | "monthly" // Must match pattern
}Features:
- Pattern must match category
- Cannot be deleted by auto-delete system
- Completion resets automatically
- Visual indicator in task list
The app includes a comprehensive theme system with persistent storage:
interface ColorScheme {
// Base colors
primary: string;
secondary: string;
background: string;
surface: string;
// Text colors
text: string;
textMuted: string;
// Status colors
success: string;
warning: string;
danger: string;
// UI elements
border: string;
// Gradients
gradients: {
primary: string[];
background: string[];
surface: string[];
success: string[];
warning: string[];
danger: string[];
};
}Features:
- Automatic detection of system theme preference
- Manual theme toggle in settings
- Persistent theme selection using AsyncStorage
- Smooth theme transitions
- Context-based theme provider
- Multi-line text input support
- Add button with gradient styling
- Auto-focus on input field
- Empty input validation
- Inline editing mode
- Save/Cancel actions
- Real-time preview
- Multi-line support
- Confirmation dialog
- Animated removal
- Undo capability (future)
- Real-time progress bar
- Completion percentage
- Task count statistics
- Visual feedback
- Total Todos: Overall task count
- Completed: Finished tasks
- Active: Pending tasks
- Color-coded cards with icons
- Dark mode toggle
- Notifications (UI ready)
- Auto-sync (UI ready)
- Clear all todos option
- Confirmation required
- Deletion count feedback
Contributions are welcome! Please follow these steps:
Click the "Fork" button at the top right of this page.
git clone https://github.com/YOUR_USERNAME/TO-DO-Mobile-App.git
cd TO-DO_APPgit checkout -b feature/amazing-feature- Write clean, documented code
- Follow the existing code style
- Test your changes thoroughly
git add .
git commit -m "Add: amazing feature description"git push origin feature/amazing-featureGo to your fork on GitHub and click "New Pull Request".
- Use TypeScript for type safety
- Follow functional component patterns
- Use React Hooks appropriately
- Add comments for complex logic
- Keep components small and focused
This project is licensed under the MIT License. See LICENSE file for details.
MIT License
Copyright (c) 2026 Soumen Das
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction...
Soumen Das
- GitHub: @soumen0818
- Email: dassoumen0818@gmail.com
- React Native - Mobile app framework
- Expo - Development platform and deployment
- Supabase - Backend platform with PostgreSQL
- TypeScript - Type safety and developer experience
- Expo Notifications - Push notification system
- AsyncStorage - Local data persistence
- Modern mobile design patterns
- Material Design guidelines
- iOS Human Interface Guidelines
- Community feedback and user suggestions
- Real-world task management workflows
- Expo team for incredible development tools and EAS Build
- Supabase team for powerful open-source backend infrastructure
- React Native community for continuous support and innovations
- Open source contributors who make amazing tools freely available
- All users and contributors of Zenith Task
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: dassoumen0818@gmail.com
When reporting bugs, please include:
- Device Information: Model and OS version (e.g., Samsung Galaxy S21, Android 13)
- App Version: Check in Settings screen
- Steps to Reproduce: Detailed steps that trigger the bug
- Expected Behavior: What should happen
- Actual Behavior: What actually happens
- Screenshots/Videos: Visual evidence if applicable
- Error Messages: Any error messages or logs
Have an idea to improve Zenith Task? We'd love to hear it!
- Check existing issues to avoid duplicates
- Open a new issue with the "Feature Request" label
- Describe the feature and its benefits
- Include mockups or examples if possible
Zenith Task - Smart Task Management for Modern Life
Made with ❤️ by Soumen Das
© 2026 Zenith Task. All rights reserved.