A desktop time tracking application built with Electron, React, and TypeScript that integrates with the TickSpot API for seamless time logging and project management.
- Start/Stop Timer: Simple one-click timer control with visual feedback
- Time Display: Real-time display of elapsed time in hours and minutes
- Timer State Persistence: Timer state is maintained even when the app is minimized
- Project Management: Fetch and display projects from your TickSpot account
- Task Management: Browse tasks within selected projects
- Time Logging: Automatically log time entries to TickSpot with project and task selection
- Client Management: View and manage clients associated with projects
- System Tray Integration: Minimize to system tray with persistent icon
- Taskbar Integration: Pin to taskbar with dynamic overlay icon showing timer status
- Global Shortcuts: Use
Ctrl+Shift+Tto toggle window visibility - Single Instance: Only one instance can run at a time, preventing duplicate launches
- Window Management: Smart window restoration and focus handling
- Modern UI: Built with Material-UI components for a clean, professional look
- Responsive Design: Optimized for the desktop window size (400x450)
- Visual Feedback:
- Timer status indicated by icon changes (default vs. active state)
- Taskbar overlay icon shows when timer is running
- System tray icon reflects current timer state
- API Configuration: Secure storage of TickSpot API credentials
- General Settings: Customizable application preferences
- Persistent Settings: Settings are saved and restored between sessions
- Node.js (v16 or higher)
- npm or yarn
-
Clone the repository:
git clone <repository-url> cd tick-tracker
-
Install dependencies:
npm install
-
Start the development server:
npm run dev
-
In a separate terminal, start Electron:
npm run electron
To create a distributable package:
npm run buildThis will create:
- Windows installer in
dist/directory - Portable executable in
dist/win-unpacked/
- Get your TickSpot API token from your account settings
- Note your subscription ID from the TickSpot URL
- Configure these in the app's settings dialog
- Read access to projects and tasks
- Write access for time entries
- Access to client information
- Start Timer: Click the start button to begin tracking time
- Select Project: Choose a project from the dropdown
- Select Task: Choose a specific task within the project
- Stop Timer: Click stop when finished
- Log Time: The time will be automatically logged to TickSpot
- Minimize: Window minimizes to system tray
- Close: Window hides to system tray (use tray menu to quit)
- Restore: Click tray icon or taskbar icon to restore window
- Global Shortcut: Press
Ctrl+Shift+Tto toggle window visibility
- Left Click: Toggle window visibility
- Right Click: Context menu with options:
- Show App
- Hide App
- Quit
- Frontend: React 19 with TypeScript
- Backend: Electron main process
- UI Framework: Material-UI (MUI)
- Build Tool: Vite
- Package Manager: npm
main.js: Electron main process with window and tray managementApp.tsx: Main React application componenttickApi.ts: TickSpot API integration serviceSettingsDialog.tsx: Application settings interfaceProjectList.tsx: Project and task selection component
tick-tracker/
βββ src/
β βββ components/ # React components
β βββ services/ # API services
β βββ assets/ # Static assets
βββ public/ # Public assets (icons)
βββ dist/ # Built application
βββ main.js # Electron main process
βββ preload.js # Electron preload script
βββ package.json # Project configuration
- Vite: Configured for React with relative asset paths
- Electron Builder: Windows installer with proper resource handling
- Single Instance Lock: Prevents multiple app instances
- Icon Management: Proper handling of tray and taskbar icons
npm run dev: Start Vite development servernpm run electron: Start Electron in development modenpm run build: Build for productionnpm run lint: Run ESLint
- The app uses relative paths for assets in production builds
- Icons are properly packaged and accessible in both dev and production
- Single instance lock prevents multiple app launches
- Timer state is preserved across window operations
- Timer not starting: Check TickSpot API credentials in settings
- Icons not showing: Ensure icon files are in the
public/directory - Multiple instances: The app enforces single instance - close existing instances first
- Taskbar overlay not updating: Restart the app to refresh icon states
- Verify your TickSpot API token is valid
- Check your subscription ID is correct
- Ensure you have proper permissions for the projects/tasks
[Add your license information here]
[Add contribution guidelines if applicable]