Features: Add favorite projects feature allowing users to star/bookmark frequently used projects New UserFavoriteProject association model with user-project relationships Star icons in project list for one-click favorite toggling via AJAX Filter to display only favorite projects Per-user favorites with proper isolation and cascade delete behavior Activity logging for favorite/unfavorite actions Database: Add user_favorite_projects table with migration (023_add_user_favorite_projects.py) Foreign keys to users and projects with CASCADE delete Unique constraint preventing duplicate favorites Indexes on user_id and project_id for query optimization Models: User model: Add favorite_projects relationship with helper methods add_favorite_project() - add project to favorites remove_favorite_project() - remove from favorites is_project_favorite() - check favorite status get_favorite_projects() - retrieve favorites with status filter Project model: Add is_favorited_by() method and include favorite status in to_dict() Export UserFavoriteProject model in app/models/__init__.py Routes: Add /projects/<id>/favorite POST endpoint to favorite a project Add /projects/<id>/unfavorite POST endpoint to unfavorite a project Update /projects GET route to support favorites=true query parameter Fix status filtering to work correctly with favorites JOIN query Add /reports/export/form GET endpoint for enhanced CSV export form Templates: Update projects/list.html: Add favorites filter dropdown to filter form (5-column grid) Add star icon column with Font Awesome icons (filled/unfilled) Add JavaScript toggleFavorite() function for AJAX favorite toggling Improve hover states and transitions for better UX Pass favorite_project_ids and favorites_only to template Update reports/index.html: Update CSV export link to point to new export form Add icon and improve hover styling Reports: Enhance CSV export functionality with dedicated form page Add filter options for users, projects, clients, and date ranges Set default date range to last 30 days Import Client model and or_ operator for advanced filtering Testing: Comprehensive test suite in tests/test_favorite_projects.py (550+ lines) Model tests for UserFavoriteProject creation and validation User/Project method tests for favorite operations Route tests for favorite/unfavorite endpoints Filtering tests for favorites-only view Relationship tests for cascade delete behavior Smoke tests for complete workflows Coverage for edge cases and error handling Documentation: Add comprehensive feature documentation in docs/FAVORITE_PROJECTS_FEATURE.md User guide with step-by-step instructions Technical implementation details API documentation for new endpoints Migration guide and troubleshooting Performance and security considerations Template Cleanup: Remove duplicate templates from root templates/ directory Admin templates (dashboard, users, settings, OIDC debug, etc.) Client CRUD templates Error page templates Invoice templates Project templates Report templates Timer templates All templates now properly located in app/templates/ Breaking Changes: None - fully backward compatible Migration Required: Run alembic upgrade head to create user_favorite_projects table
TimeTracker
Professional Time Tracking & Project Management for Teams
Track time. Manage projects. Generate invoices. All in one place.
🚀 Quick Start • ✨ Features • 📸 Screenshots • 📖 Getting Started • 📚 Documentation • 🐳 Deploy
🎯 What is TimeTracker?
TimeTracker is a self-hosted, web-based time tracking application designed for freelancers, teams, and businesses who need professional time management with complete control over their data.
Perfect for:
- 💼 Freelancers tracking billable hours across multiple clients
- 👥 Small Teams managing projects and tracking productivity
- 🏢 Agencies needing detailed reporting and client billing
- 🔒 Privacy-focused organizations wanting self-hosted solutions
✨ Features
⏱️ Smart Time Tracking
- One-Click Timers — Start tracking with a single click
- Persistent Timers — Timers keep running even after browser closes
- Idle Detection — Automatic pause after configurable idle time
- Manual Entry — Add historical time entries with notes and tags
- Real-time Updates — See live timer updates across all devices
📊 Project & Task Management
- Unlimited Projects & Tasks — Organize work your way
- Client Management — Store client details and billing rates
- Task Board — Visual task management with priorities and assignments
- Status Tracking — Monitor progress from to-do to completion
- Estimates vs Actuals — Track project budgets and burn rates
🧾 Professional Invoicing
- Generate from Time — Convert tracked hours to invoices automatically
- Custom Line Items — Add manual items for expenses or services
- Tax Calculation — Automatic tax calculations with configurable rates
- PDF Export — Professional invoice templates (coming soon)
- Status Tracking — Track draft, sent, paid, and overdue invoices
📈 Analytics & Reporting
- Visual Dashboards — Charts and graphs for quick insights
- Detailed Reports — Time breakdown by project, user, or date range
- CSV Export — Export data for external analysis
- Billable vs Non-billable — Separate tracking for accurate billing
- Custom Date Ranges — Flexible reporting periods
🔐 Multi-User & Security
- Role-Based Access — Admin and user roles with appropriate permissions
- User Management — Add team members and manage access
- Self-Hosted — Complete control over your data
- Username-Only Login — Simple authentication for internal use
- Session Management — Secure cookies and session handling
- Profile Pictures — Users can upload a profile picture in their profile settings
🛠️ Technical Excellence
- Docker Ready — Deploy in minutes with Docker Compose
- Database Flexibility — PostgreSQL for production, SQLite for testing
- Responsive Design — Works perfectly on desktop, tablet, and mobile
- Real-time Sync — WebSocket support for live updates
- Automatic Backups — Scheduled database backups (configurable)
📸 Screenshots
🏠 Dashboard — Your Command Center
Start timers, view recent entries, and see your productivity at a glance
🔐 Simple Login & User Management
Simple username-based authentication and customizable user profiles with avatar support
📁 Projects & Tasks — Stay Organized
Manage multiple projects and break them down into actionable tasks
📋 Kanban Board — Visual Task Management
Drag-and-drop task management with customizable columns and visual workflow
⏱️ Time Tracking — Flexible & Powerful
Manual time entry and reusable templates for faster logging
🧾 Invoicing & Clients — Professional Billing
Generate invoices from tracked time and manage client relationships
📊 Reports & Analytics — Data-Driven Insights
Comprehensive reporting and user analytics for informed decisions
🛠️ Admin Dashboard — Complete Control
Manage users, configure settings, and monitor system health
🎯 Easy Creation — Streamlined Workflows
Simple, intuitive forms for creating projects, tasks, and clients
🚀 Quick Start
Docker (Recommended)
Get TimeTracker running in under 2 minutes:
# Clone the repository
git clone https://github.com/drytrix/TimeTracker.git
cd TimeTracker
# Create your .env from the template and set SECRET_KEY and TZ
cp env.example .env
# Edit .env and set a strong SECRET_KEY (python -c "import secrets; print(secrets.token_hex(32))")
# Start with Docker Compose (HTTPS via nginx)
docker-compose up -d
# Access at https://localhost (self-signed cert)
# Prefer plain HTTP on port 8080?
# Use the example compose that publishes the app directly:
# docker-compose -f docker-compose.example.yml up -d
# Access at http://localhost:8080
See the full Docker Compose setup guide: docs/DOCKER_COMPOSE_SETUP.md
First login creates the admin account — just enter your username!
Quick Test with SQLite
Want to try it out without setting up a database?
docker-compose -f docker-compose.local-test.yml up --build
No configuration needed — perfect for testing!
💡 Use Cases
For Freelancers
Track time across multiple client projects, generate professional invoices, and understand where your time goes. TimeTracker helps you bill accurately and identify your most profitable clients.
For Teams
Assign tasks, track team productivity, and generate reports for stakeholders. See who's working on what, identify bottlenecks, and optimize team performance.
For Agencies
Manage multiple clients and projects simultaneously. Track billable hours, generate client invoices, and analyze project profitability — all in one place.
For Personal Projects
Even if you're not billing anyone, understanding where your time goes is valuable. Track personal projects, hobbies, and learning activities to optimize your time.
🌟 Why TimeTracker?
| Feature | TimeTracker | Traditional Time Trackers |
|---|---|---|
| Self-Hosted | ✅ Complete data control | ❌ Cloud-only, subscription fees |
| Open Source | ✅ Free to use & modify | ❌ Proprietary, locked features |
| Persistent Timers | ✅ Runs server-side | ❌ Browser-dependent |
| Docker Ready | ✅ Deploy anywhere | ⚠️ Complex setup |
| Invoicing Built-in | ✅ Track to bill workflow | ❌ Requires integration |
| No User Limits | ✅ Unlimited users | ❌ Per-user pricing |
📚 Documentation
Comprehensive documentation is available in the docs/ directory:
Getting Started
- 📖 Getting Started Guide — Complete beginner's guide (⭐ Start here!)
- Installation Guide — Detailed setup instructions
- Requirements — System requirements and dependencies
- Troubleshooting — Common issues and solutions
- CSRF Token Issues — Fix "CSRF token missing or invalid" errors
- CSRF IP Access Fix — 🔥 Fix cookies not working when accessing via IP address
- HTTPS Auto-Setup — 🚀 Automatic HTTPS at startup (one command!)
- HTTPS Manual Setup (mkcert) — 🔒 Manual HTTPS with no certificate warnings
Features
- Task Management — Break projects into manageable tasks
- Invoice System — Generate professional invoices
- Client Management — Manage client relationships
- Calendar Features — Calendar and bulk entry features
- Command Palette — Keyboard shortcuts for power users
Technical Documentation
- Project Structure — Codebase architecture
- Database Migrations — Database schema management
- Version Management — Release and versioning
- CSRF Configuration — Security and CSRF token setup for Docker
- CI/CD Documentation — Continuous integration setup
Contributing
- Contributing Guidelines — How to contribute
- Code of Conduct — Community standards
🐳 Deployment
Local Development
docker-compose up -d
Production with PostgreSQL
# Configure your .env file
cp env.example .env
# Edit .env with production settings (set SECRET_KEY, TZ, DB credentials)
# Start with production compose (published image)
docker-compose -f docker-compose.remote.yml up -d
⚠️ Security Note: Always set a unique
SECRET_KEYin production! See CSRF Configuration for details.
Raspberry Pi
TimeTracker runs perfectly on Raspberry Pi 4 (2GB+):
# Same commands work on ARM architecture
docker-compose up -d
📖 See Deployment Guide for detailed instructions
🔧 Configuration
TimeTracker is highly configurable through environment variables. For a comprehensive list and recommended values, see:
Common settings:
# Timezone and locale
TZ=America/New_York
CURRENCY=USD
# Timer behavior
SINGLE_ACTIVE_TIMER=true
IDLE_TIMEOUT_MINUTES=30
ROUNDING_MINUTES=1
# User management
ADMIN_USERNAMES=admin,manager
ALLOW_SELF_REGISTER=false
# Security (production)
SECRET_KEY=your-secure-random-key
SESSION_COOKIE_SECURE=true
📊 Analytics & Telemetry
TimeTracker includes optional analytics and monitoring features to help improve the application and understand how it's being used. All analytics features are:
- ✅ Disabled by default — You must explicitly opt-in
- ✅ Privacy-first — No personally identifiable information (PII) is collected
- ✅ Self-hostable — Run your own analytics infrastructure
- ✅ Transparent — All data collection is documented
What We Collect (When Enabled)
1. Structured Logs (Always On, Local Only)
- Request logs and error messages stored locally in
logs/app.jsonl - Used for troubleshooting and debugging
- Never leaves your server
2. Prometheus Metrics (Always On, Self-Hosted)
- Request counts, latency, and performance metrics
- Exposed at
/metricsendpoint for your Prometheus server - Stays on your infrastructure
3. Error Monitoring (Optional - Sentry)
- Captures uncaught exceptions and performance issues
- Helps identify and fix bugs quickly
- Opt-in: Set
SENTRY_DSNenvironment variable
4. Product Analytics (Optional - PostHog)
- Tracks feature usage and user behavior patterns with advanced features:
- Person Properties: Role, auth method, login history
- Feature Flags: Gradual rollouts, A/B testing, kill switches
- Group Analytics: Segment by version, platform, deployment
- Rich Context: Browser, device, environment on every event
- Opt-in: Set
POSTHOG_API_KEYenvironment variable - See POSTHOG_ADVANCED_FEATURES.md for complete guide
5. Installation Telemetry (Optional, Anonymous)
- Sends anonymous installation data via PostHog with:
- Anonymized fingerprint (SHA-256 hash, cannot be reversed)
- Application version
- Platform information
- No PII: No IP addresses, usernames, or business data
- Opt-in: Set
ENABLE_TELEMETRY=trueandPOSTHOG_API_KEYenvironment variables
How to Enable Analytics
# Enable Sentry error monitoring (optional)
SENTRY_DSN=https://your-sentry-dsn@sentry.io/project-id
SENTRY_TRACES_RATE=0.1 # 10% sampling for performance traces
# Enable PostHog product analytics (optional)
POSTHOG_API_KEY=your-posthog-api-key
POSTHOG_HOST=https://app.posthog.com
# Enable anonymous telemetry (optional, uses PostHog)
ENABLE_TELEMETRY=true
TELE_SALT=your-unique-salt
APP_VERSION=1.0.0
Self-Hosting Analytics
You can self-host all analytics services for complete control:
# Use docker-compose with monitoring profile
docker-compose --profile monitoring up -d
This starts:
- Prometheus — Metrics collection and storage
- Grafana — Visualization dashboards
- Loki (optional) — Log aggregation
- Promtail (optional) — Log shipping
Privacy & Data Protection
Telemetry: TimeTracker can optionally send anonymized usage data to help improve the product (errors, feature usage, install counts). All telemetry is opt-in. No personal data is collected. To disable telemetry, set
ENABLE_TELEMETRY=falseor simply don't set the environment variable (disabled by default).
What we DON'T collect:
- ❌ Email addresses or usernames
- ❌ IP addresses
- ❌ Project names or descriptions
- ❌ Time entry notes or client data
- ❌ Any personally identifiable information (PII)
Your rights:
- 📥 Access: View all collected data
- ✏️ Rectify: Correct inaccurate data
- 🗑️ Erase: Delete your data at any time
- 📤 Export: Export your data in standard formats
📖 See Privacy Policy for complete details
📖 See Analytics Documentation for configuration
📖 See Events Schema for tracked events
🛣️ Roadmap
Planned Features
- 📄 PDF Invoice Templates — Professional PDF generation
- 📧 Email Integration — Send invoices to clients
- 📱 Progressive Web App — Install as mobile app
- 🔄 Recurring Invoices — Automate recurring billing
- 🎨 Custom Themes — Personalize your interface
- 🔌 API Extensions — RESTful API for integrations
- 📊 Advanced Analytics — More charts and insights
Recently Added
- ✅ Invoice Generation — Complete invoicing system
- ✅ Task Management — Full task tracking and management
- ✅ Command Palette — Keyboard-driven navigation
- ✅ Calendar View — Visual time entry calendar
- ✅ Bulk Operations — Bulk time entry creation
🤝 Contributing
We welcome contributions! Whether it's:
- 🐛 Bug Reports — Help us identify issues
- 💡 Feature Requests — Share your ideas
- 📝 Documentation — Improve our docs
- 💻 Code Contributions — Submit pull requests
📖 See Contributing Guidelines to get started
📄 License
TimeTracker is licensed under the GNU General Public License v3.0.
This means you can:
- ✅ Use it commercially
- ✅ Modify and adapt it
- ✅ Distribute it
- ✅ Use it privately
See LICENSE for full details
🆘 Support
- 📖 Documentation: Check the
docs/directory - 🐛 Bug Reports: Open an issue
- 💬 Discussions: GitHub Discussions
- 📧 Contact: Create an issue for support
⭐ Star Us!
If TimeTracker helps you track your time better, consider giving us a star on GitHub! It helps others discover the project.