A modern desktop and web productivity app built with Electron that combines a customizable timer with task management, notes, and motivational quotes to help you stay focused and productive.
-
Advanced Timer System
- Flexible timer with compact and expanded views
- Visual progress tracking with circular display
- Customizable sound notifications (bell, chime, ding)
- Smart pause timer with 5-minute limit
- Add time functionality (+5 minutes)
- Keyboard shortcuts for quick control
- Task completion confirmation dialog
-
Task Management
- Create and track tasks with durations
- Task completion history and metrics
- Multi-task selection and bulk operations
- Task efficiency tracking
-
Notes System
- Rich text editor for task notes
- Save and organize notes locally
- Notes history tracking
-
Motivational Features
- Dynamic quote display with categories
- Favorite quotes collection
- Floating quotes for ambient motivation
- Task-specific quote matching
- Completion celebrations with confetti
-
Desktop App Features
- Always-on-top window
- Custom titlebar with window controls
- Frameless window design
- System tray integration
- Automatic updates
-
Modern UI/UX
- Clean, responsive interface using shadcn/ui
- Dark/light theme support
- Accessible design with ARIA support
- Smooth transitions and animations
- Custom toast notifications
These features require Supabase and Resend setup:
- Email task summaries with metrics
- Email notes sharing
- Cloud synchronization of tasks and notes
- Core: Electron, React 18 with TypeScript
- Build Tools: Vite, Electron Builder
- Styling: Tailwind CSS, shadcn/ui
- UI Components: Radix UI primitives
- Backend (Optional): Supabase Edge Functions
- Email Service (Optional): Resend
- State Management: React Query, Custom Hooks
- Form Handling: React Hook Form with Zod
- Rich Text: React MD Editor
- Testing: Jest with React Testing Library
-
Prerequisites
- Node.js (LTS version recommended)
- npm or yarn package manager
- Git
-
Installation
# Clone the repository git clone https://github.com/cipp-ashe/flowtimerapp.git # Navigate to project directory cd flowtimerapp # Install dependencies npm install
-
Basic Usage (No Configuration Required)
# Start web development server npm run dev # Start electron development npm run electron:dev
The app will run with all core features working. You'll see a warning about missing Supabase configuration, but this only affects optional email features.
-
Optional: Environment Setup for Email Features
- Create a
.env
file in the root directory - Copy variables from
.env.example
and fill in your values:# Supabase Configuration (Required for email features) VITE_SUPABASE_URL=your_supabase_project_url VITE_SUPABASE_ANON_KEY=your_supabase_anon_key # Optional: Email Service Configuration # RESEND_API_KEY=your_resend_api_key
To set up Supabase (Optional):
- Create a Supabase project at https://supabase.com
- Get your project URL and anon key from Project Settings > API
- For email functionality:
- Set up a Resend account at https://resend.com
- Add your Resend API key to enable email summaries
- Create a
-
Development & Building
# Run tests npm test # Lint code npm run lint # Build web version npm run build # Build desktop app npm run electron:build
-
Desktop App Installation After building, you can find the installers in the
release
directory:- Windows:
release/FlowTimer Setup.exe
- macOS:
release/FlowTimer.dmg
- Linux:
release/FlowTimer.AppImage
The desktop app includes additional features:
- Always-on-top window for uninterrupted focus
- Custom window controls
- System tray integration
- Automatic updates
- Windows:
src/
├── components/ # React components
│ ├── timer/ # Timer-related components
│ ├── tasks/ # Task management components
│ ├── quotes/ # Quote display components
│ └── ui/ # Reusable UI components
├── hooks/ # Custom React hooks
├── types/ # TypeScript type definitions
├── utils/ # Utility functions
└── integrations/ # External service integrations
-
Core Components
Timer
: Main container component orchestrating timer functionalityTimerCircle
: Visual circular progress indicator with SVG animationsTimerDisplay
: Digital time display with formattingTimerCompactView
/TimerExpandedView
: Responsive layout variantsTimerControls
: Play, pause, reset, and skip controlsTimerHeader
: Timer status and mode indicatorsTimerMetrics
: Statistics and performance tracking display
-
Custom Hooks
useTimer
: Core timer logic and state managementuseTimerState
: Timer state and transitionsuseTimerControls
: Control actions and handlersuseTimerEffects
: Side effects managementuseTimerMetrics
: Performance tracking calculationsuseTimerShortcuts
: Keyboard shortcuts implementationuseTimerA11y
: Accessibility features and announcements
-
Components
TaskManager
: Main task management containerTaskList
: Sortable list of active tasksTaskTable
: Detailed task view with metricsTaskRow
: Individual task item with actionsTaskInput
: New task creation interfaceCompletedTasks
: Historical task viewEmailSummaryModal
: Task summary email configuration
-
Custom Hooks
useTaskManager
: Task state and operations managementuseTaskOperations
: CRUD operations for tasksuseLoadingState
: Loading states handlinguseTransition
: Smooth state transitions
-
Components
QuoteDisplay
: Main quote presentationFavoriteQuotes
: Saved quotes collectionFloatingQuotes
: Ambient motivational display
-
Custom Hooks
useQuoteManager
: Quote fetching and managementuseTransition
: Animation handling for quote changes
-
Audio System
SoundSelector
: Notification sound customizationuseAudio
: Audio playback management
-
UI Components
- Comprehensive set of shadcn/ui components
- Custom toast notifications system
- Responsive dialog components
- Accessible form elements
interface TimerMetrics {
startTime: Date | null;
endTime: Date | null;
pauseCount: number;
expectedTime: number;
actualDuration: number;
favoriteQuotes: number;
pausedTime: number;
lastPauseTimestamp: Date | null;
extensionTime: number;
netEffectiveTime: number;
efficiencyRatio: number;
completionStatus: 'Completed Early' | 'Completed On Time' | 'Completed Late';
}
interface UseTimerReturn {
timeLeft: number;
minutes: number;
isRunning: boolean;
metrics: TimerMetrics;
start: () => void;
pause: () => void;
reset: () => void;
addTime: (minutes: number) => void;
setMinutes: (minutes: number) => void;
completeTimer: () => void;
}
interface Task {
id: string;
name: string;
metrics?: TimerMetrics;
completed?: boolean;
}
interface TaskSummary {
taskName: string;
completed: boolean;
metrics?: TimerMetrics;
relatedQuotes: Quote[];
}
interface Quote {
text: string;
author: string;
categories: ('motivation' | 'focus' | 'creativity' | 'learning' | 'persistence' | 'growth')[];
timestamp?: string;
task?: string;
}
- Task summary email delivery via Resend through Supabase Edge Function
- Daily task summaries with metrics and related quotes
- Error handling and retry mechanisms
- Real-time timer state management
- Multi-task selection and bulk operations
- Quote categorization and task association
- Metrics calculation and performance tracking
- Precise time tracking with pause/resume capability
- Efficiency ratio calculation: (expectedTime / netEffectiveTime) * 100
- Extension time tracking for overtime sessions
- Motivational toast notifications during key events
- Multi-select tasks with Ctrl/Cmd + Click
- Task metrics tracking including pause counts and duration
- Email summary generation with formatted daily reports (optional)
- Quote association with specific tasks
-
Smart Quote Selection
- Context-aware quote selection based on task keywords
- Automatic categorization into focus, creativity, learning, persistence, motivation, and growth
- Quote pool management with shuffling for variety
- 15-second auto-cycling for continuous motivation
-
Task Integration
- Intelligent matching of quotes to task context
- Keyword analysis for category determination
- Fallback to motivation/focus categories when no specific match
- Task association tracking with timestamps
-
User Interaction
- Like/favorite quote functionality with task context
- Smooth transition animations between quotes
- Toast notifications for favorite additions
- Quote history tracking with task correlation
-
Performance Features
- Quote pool pre-shuffling for performance
- Transition state management
- Debounced quote cycling
- Optimized re-rendering with state management
We welcome contributions! Here's how you can help:
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
- Follow the existing code style and conventions
- Add tests for new features
- Update documentation as needed
- Ensure all tests pass before submitting PR
- Keep PR scope focused and manageable
For security issues, please review our Security Policy and follow the reporting guidelines there.
This project is licensed under the MIT License - see the LICENSE file for details.