A beautiful, feature-rich task management app for personal and team productivity
Features β’ Screenshots β’ Tech Stack β’ Architecture β’ Getting Started β’ Project Structure
TaskHub is a modern, cross-platform task management application built with Flutter. It enables users to organize their personal tasks and collaborate with teams on projects. With a beautiful dark/light theme, smooth animations, and real-time synchronization, TaskHub provides a delightful productivity experience.
-
Task Management
- Create, edit, and delete tasks
- Set priorities (Low, Medium, High, Urgent)
- Track status (To Do, In Progress, Completed, Cancelled)
- Due date scheduling with overdue detection
- Recurring tasks support
- Swipe-to-delete with confirmation
-
Project Collaboration
- Create and manage projects
- Role-based access control (Admin, Editor, Viewer)
- Invite team members
- Track project progress with visual indicators
- Color-coded project organization
-
Calendar View
- Visual calendar with task scheduling
- Day/week/month views
- Task due date visualization
-
Dashboard
- Overview statistics
- Today's tasks at a glance
- Recent projects
- Quick actions
-
Notifications
- Task reminders
- Project updates
- Collaboration notifications
- Email/Password authentication
- Google OAuth sign-in
- Magic link authentication
- Password reset flow
- Email verification
| Home | Tasks | Projects | Calendar |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Home | Tasks | Projects | Calendar |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| Login | Sign Up |
|---|---|
![]() |
![]() |
| Create Task | Task Detail |
|---|---|
![]() |
![]() |
- Flutter - Cross-platform UI framework
- Dart - Programming language
- flutter_bloc - State management with BLoC pattern
- freezed - Immutable data classes with unions
- injectable + get_it - Dependency injection
- Supabase - Backend-as-a-Service
- PostgreSQL database
- Real-time subscriptions
- Row Level Security (RLS)
- Authentication
- go_router - Declarative routing with type-safe routes
- go_router_builder - Code generation for routes
- forui - Modern UI component library
- Material Design 3 - Design system
- google_sign_in - Google OAuth integration
- app_links - Deep link handling
- shared_preferences - Local storage
- rxdart - Reactive extensions for Dart
- intl - Internationalization
TaskHub follows Clean Architecture principles with a feature-based structure:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Presentation Layer β
β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββ β
β β Pages β β Widgets β β BLoC (Events/ β β
β β β β β β States) β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Domain Layer β
β βββββββββββββββββββββββ βββββββββββββββββββββββββββββββββ β
β β Entities β β Repository Interfaces β β
β β (Freezed models) β β (Abstract contracts) β β
β βββββββββββββββββββββββ βββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Data Layer β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Repository Implementations (Supabase integration) β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Error Handling - Named record return types:
Future<({AppUser? user, AuthFailure? failure})> signIn(String email, String password);State Management - BLoC with Freezed:
@freezed
class TaskEvent with _$TaskEvent {
const factory TaskEvent.loadMyTasks() = LoadMyTasks;
const factory TaskEvent.completeTask(String taskId) = CompleteTask;
}Dependency Injection - Injectable:
@injectable
class TaskBloc extends Bloc<TaskEvent, TaskState> { ... }
@LazySingleton(as: TaskRepository)
class TaskRepositoryImpl implements TaskRepository { ... }Type-safe Navigation - GoRouter:
@TypedGoRoute<TaskDetailRoute>(path: '/tasks/:taskId')
class TaskDetailRoute extends GoRouteData { ... }
// Usage
TaskDetailRoute(taskId: '123').push(context);- Flutter SDK 3.38 or higher
- A Supabase project (free tier available)
- (Optional) Google Cloud project for OAuth
-
Clone the repository
git clone https://github.com/AmanSikarwar/taskhub.git cd taskhub -
Install dependencies
flutter pub get
-
Set up environment variables
Create a
.envfile in the project root:SUPABASE_URL=your_supabase_url SUPABASE_ANON_KEY=your_anon_key GOOGLE_WEB_CLIENT_ID=your_web_client_id GOOGLE_IOS_CLIENT_ID=your_ios_client_id
-
Run code generation
dart run build_runner build --delete-conflicting-outputs
-
Run the app
flutter run
Follow these steps to set up your Supabase backend:
- Go to Supabase Dashboard
- Click New Project
- Enter a project name (e.g., "TaskHub")
- Set a secure database password (save this!)
- Select your preferred region
- Click Create new project and wait for initialization
The database schema includes 5 tables with Row Level Security policies:
- In your Supabase dashboard, go to SQL Editor (left sidebar)
- Click New query
- Open
supabase/setup.sqlfrom this repository - Copy the entire contents and paste it into the SQL Editor
- Click Run (or press Cmd/Ctrl + Enter)
- You should see "Success. No rows returned"
The script creates:
- Tables:
profiles,projects,project_members,tasks,notifications - Enums:
task_status,task_priority,project_role,notification_type - Functions: 12 helper functions and triggers for automation
- Security: Row Level Security (RLS) policies for all tables
- Realtime: Enabled for all tables for live updates
- In Supabase dashboard, go to Project Settings > API
- Copy the following:
- Project URL (e.g.,
https://xxxx.supabase.co) - anon public key (under Project API keys)
- Project URL (e.g.,
Email/Password (enabled by default) - No additional setup needed.
Google OAuth (optional):
- Go to Google Cloud Console
- Create a new project or select an existing one
- Go to APIs & Services > Credentials
- Click Create Credentials > OAuth client ID
- For Web application:
- Add
https://YOUR_PROJECT_ID.supabase.co/auth/v1/callbackto Authorized redirect URIs
- Add
- For iOS:
- Select "iOS" as application type
- Enter your bundle ID (default:
com.example.taskhub)
- Copy the Client IDs
- In Supabase dashboard:
- Go to Authentication > Providers
- Enable Google
- Paste your Client ID and Client Secret
- Save
Magic Link (optional) - Enable in Authentication > Providers > Email
iOS - Already configured in ios/Runner/Info.plist with scheme io.taskhub://auth-callback
Android - Add to android/app/src/main/AndroidManifest.xml inside the <activity> tag:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="io.taskhub" android:host="auth-callback" />
</intent-filter>βββββββββββββββ ββββββββββββββββββββ βββββββββββββββ
β profiles βββββ<β project_members β>βββββ projects β
β (users) β β (junction) β β β
βββββββββββββββ ββββββββββββββββββββ ββββββββ¬βββββββ
β β
β β
β βββββββββββββββββββ β
ββββββββββββ>β tasks β<βββββββββββββ
β β
βββββββββββββββββββ
β
ββββββββββββββββββββββ
β
v
βββββββββββββββββββ
β notifications β
βββββββββββββββββββ
For detailed setup instructions and troubleshooting, see supabase/README.md.
lib/
βββ core/ # Shared infrastructure
β βββ di/ # Dependency injection setup
β β βββ injection.dart # GetIt configuration
β β βββ register_module.dart # Module registrations
β β
β βββ router/ # Navigation
β β βββ app_router.dart # Route definitions
β β βββ app_router.g.dart # Generated routes
β β
β βββ theme/ # Theming
β β βββ app_theme.dart # Colors, typography, themes
β β
β βββ widgets/ # Reusable widgets
β β βββ animated_list_item.dart # Animation utilities
β β βββ app_widgets.dart # Common UI components
β β βββ app_bottom_sheets.dart # Bottom sheet helpers
β β
β βββ utils/ # Utilities
β β βββ app_utils.dart # Helper functions
β β βββ error_messages.dart # Error message formatting
β β
β βββ env/ # Environment configuration
β β βββ env.dart # Envied environment variables
β β
β βββ deep_link/ # Deep link handling
β β βββ deep_link_handler.dart # Auth callback handling
β β
β βββ error/ # Error types
β βββ failures.dart # Failure definitions
β
βββ features/ # Feature modules
β β
β βββ auth/ # Authentication
β β βββ data/
β β β βββ repositories/
β β β βββ auth_repository_impl.dart
β β βββ domain/
β β β βββ entities/
β β β β βββ app_user.dart
β β β β βββ auth_failure.dart
β β β βββ repositories/
β β β βββ auth_repository.dart
β β βββ presentation/
β β βββ bloc/
β β β βββ auth_bloc.dart
β β β βββ auth_event.dart
β β β βββ auth_state.dart
β β βββ pages/
β β β βββ login_page.dart
β β β βββ signup_page.dart
β β β βββ forgot_password_page.dart
β β β βββ magic_link_page.dart
β β β βββ update_password_page.dart
β β β βββ email_verification_page.dart
β β βββ widgets/
β β βββ auth_wrapper.dart
β β
β βββ tasks/ # Task management
β β βββ data/
β β β βββ repositories/
β β β βββ task_repository_impl.dart
β β βββ domain/
β β β βββ entities/
β β β β βββ task.dart
β β β β βββ task_failure.dart
β β β βββ repositories/
β β β βββ task_repository.dart
β β βββ presentation/
β β βββ bloc/
β β β βββ task_bloc.dart
β β βββ pages/
β β β βββ my_tasks_page.dart
β β β βββ task_detail_page.dart
β β βββ widgets/
β β βββ task_tile.dart
β β βββ task_card.dart
β β βββ tasks_listview.dart
β β βββ create_task_dialog.dart
β β
β βββ projects/ # Project management
β β βββ data/
β β βββ domain/
β β βββ presentation/
β β
β βββ calendar/ # Calendar view
β β βββ presentation/
β β βββ pages/
β β βββ calendar_page.dart
β β
β βββ home/ # Dashboard
β β βββ presentation/
β β βββ pages/
β β β βββ home_page.dart
β β βββ widgets/
β β βββ main_shell.dart
β β βββ dashboard_header.dart
β β βββ stats_overview.dart
β β βββ today_tasks_section.dart
β β βββ recent_project_section.dart
β β
β βββ notifications/ # Notifications
β β βββ presentation/
β β
β βββ profile/ # User profile
β β βββ presentation/
β β
β βββ onboarding/ # Onboarding flow
β βββ presentation/
β βββ pages/
β βββ splash_page.dart
β βββ onboarding_page.dart
β
βββ main.dart # App entry point
| Variable | Description | Required |
|---|---|---|
SUPABASE_URL |
Your Supabase project URL | Yes |
SUPABASE_ANON_KEY |
Supabase anonymous/public key | Yes |
GOOGLE_WEB_CLIENT_ID |
Google OAuth web client ID | No |
GOOGLE_IOS_CLIENT_ID |
Google OAuth iOS client ID | No |
This project is licensed under the MIT License - see the LICENSE file for details.












