Powered by DryTrix
++ Enter your username to start tracking time +
+ + + ++ + New users will be created automatically +
+ {% endif %} ++ The request you made is invalid or contains errors. This could be due to: +
++ You don't have permission to access this resource. This could be due to: +
++ The page you're looking for doesn't exist or has been moved. +
+ ++ Something went wrong on our end. Please try again later. +
+ ++ {% if error.description %} + {{ error.description }} + {% else %} + An error occurred while processing your request. + {% endif %} +
+Track your productivity and manage your time effectively with DryTrix TimeTracker
++ {{ active_timer.project.name }} +
+Ready to start tracking your time?
+Hours Today
+ + {% if today_hours > 0 %}Active day{% else %}No activity yet{% endif %} + +Hours This Week
+ + {% if week_hours > 0 %}Good progress{% else %}Start tracking{% endif %} + +Hours This Month
+ + {% if month_hours > 0 %}Consistent work{% else %}New month{% endif %} + +| Project | +Duration | +Date | +Notes | +Actions | +
|---|---|---|---|---|
|
+
+
+
+
+
+
+
+
+ {{ entry.project.name }}
+ {{ entry.project.client }}
+
+ |
+ + {{ entry.duration_formatted }} + | +
+
+ {{ entry.start_utc.strftime('%b %d') }}
+ {{ entry.start_utc.strftime('%H:%M') }}
+
+ |
+
+ {% if entry.notes %}
+
+ {{ entry.notes[:50] }}{% if entry.notes|length > 50 %}...{% endif %}
+
+ {% else %}
+ No notes
+ {% endif %}
+ |
+
+
+
+
+
+ {% if current_user.is_admin or entry.user_id == current_user.id %}
+
+ {% endif %}
+
+ |
+
Start tracking your time to see entries here
+ + Log Your First Entry + +| Project | +Start | +End | +Duration | +Notes | +Tags | +Actions | +
|---|---|---|---|---|---|---|
| + {{ entry.project.name }} + | +{{ entry.start_utc.strftime('%Y-%m-%d %H:%M') }} | +{{ entry.end_utc.strftime('%Y-%m-%d %H:%M') if entry.end_utc else '-' }} | +{{ entry.duration_formatted }} | ++ {% if entry.notes %} + {{ entry.notes[:80] }}{% if entry.notes|length > 80 %}...{% endif %} + {% else %}-{% endif %} + | +{{ entry.tags or '-' }} | +
+
+
+
+
+ {% if current_user.is_admin or entry.user_id == current_user.id %}
+
+ {% endif %}
+
+ |
+
Try a different query or check your spelling.
+Self-hosted time tracking for teams and freelancers
+ +Built for reliability, designed for simplicity, and engineered for performance
+ +Server-side timers that survive browser restarts and computer reboots. Never lose track of your time again.
+Full control over your data with no cloud dependencies. Deploy on your own infrastructure with confidence.
+Comprehensive reports and analytics with CSV export capabilities for external analysis and billing.
+User roles, project organization, and billing support for teams of any size.
+Simple deployment with Docker and Docker Compose. Perfect for Raspberry Pi and production environments.
+Licensed under GPL v3, ensuring derivatives remain open source and accessible to everyone.
+Beautiful, intuitive interface designed for productivity and ease of use
+ +
+ Clean, intuitive interface showing active timers and recent activity. Quick access to start/stop timers and manual time entry.
+
+ Client and project organization with billing information. Time tracking across multiple projects simultaneously.
+
+ Comprehensive time reports with export capabilities. Visual breakdowns of time allocation and productivity.
+✅ Persistent server-side timers
+✅ Self-hosted, no cloud required
+✅ Simple Docker deployment
+✅ Rich reporting and exports
+✅ Team collaboration features
+Deploy TimeTracker on your Raspberry Pi or any Linux system with just a few commands
+ +Get the latest version of TimeTracker from GitHub
+Set up your environment variables and preferences
+Launch TimeTracker with Docker Compose
+Open your browser and start tracking time
+Open Source
+Cloud Dependencies
+Customization
+Easy Deployment
+Total Users
+Total Projects
+Time Entries
+Total Hours
+| User | +Project | +Date | +Duration | +Status | +
|---|---|---|---|---|
| {{ entry.user.username }} | ++ + {{ entry.project.name }} + + | +{{ entry.start_utc.strftime('%Y-%m-%d %H:%M') }} | ++ {{ entry.duration_formatted }} + | ++ {% if entry.end_utc %} + Completed + {% else %} + Running + {% endif %} + | +
No time entries have been recorded recently.
+Configure application-wide settings such as timezone, currency, timer behavior, and data export options.
+Choose a unique username for the user. This will be used for login.
+ +
+ User: Can track time, view projects, and generate reports.
+ Admin: Can manage users, projects, and system settings.
+
Inactive users cannot log in or access the system.
+ + {% if user %} +These actions cannot be undone.
+ +Total Users
+Active Users
+Admin Users
+Total Hours
+| Username | +Role | +Status | +Created | +Last Login | +Total Hours | +Actions | +
|---|---|---|---|---|---|---|
|
+
+ {{ user.username }}
+ {% if user.active_timer %}
+
+ + Timer Running + + {% endif %} + |
+ + {% if user.role == 'admin' %} + Admin + {% else %} + User + {% endif %} + | ++ {% if user.is_active %} + Active + {% else %} + Inactive + {% endif %} + | +{{ user.created_at.strftime('%Y-%m-%d') }} | ++ {% if user.last_login %} + {{ user.last_login.strftime('%Y-%m-%d %H:%M') }} + {% else %} + Never + {% endif %} + | ++ {{ "%.1f"|format(user.total_hours) }}h + | +
+
+
+
+
+ {% if user.id != current_user.id %}
+
+ {% endif %}
+
+ |
+
+ The request you made is invalid or contains errors. This could be due to: +
++ You don't have permission to access this resource. This could be due to: +
++ The page you're looking for doesn't exist or has been moved. +
+ ++ Something went wrong on our end. Please try again later. +
+ ++ A simple, efficient time tracking solution for teams and individuals. +
++ Developed by DryTrix +
++ {{ app_name }} is a web-based time tracking application designed for internal use within organizations. + It provides a simple and intuitive interface for tracking time spent on various projects and tasks. +
++ Built with modern web technologies, it offers real-time timer functionality, comprehensive reporting, + and user management features while maintaining simplicity and ease of use. +
++ DryTrix is a software development company specializing in creating efficient, + user-friendly business applications. Our focus is on delivering solutions that streamline + workflows and improve productivity. +
++ TimeTracker represents our commitment to building software that is both powerful and + accessible, designed with the end-user in mind. We believe in creating tools that + teams actually want to use. +
++ {{ app_name }} is designed for internal use and prioritizes data security and privacy: +
++ Need help using {{ app_name }}? Here are some resources: +
++ Check the help section for detailed instructions on using all features. +
+ + View Help + ++ View system status and configuration details. +
+ {% if current_user.is_admin %} + + System Info + + {% else %} + Admin access required + {% endif %} +TimeTracker by DryTrix
+You can also create time entries manually by specifying start and end times, useful for recording time spent away from the computer.
+Click on any project to view detailed statistics, time entries, and user breakdowns.
+Use the CSV export feature to download time entries for use in external tools like Excel or accounting software.
+| Project | +Status | +Total Hours | +Billable Hours | +Actions | +
|---|---|---|---|---|
|
+
+ {{ project.name }}
+
+ {% if project.description %}
+ {{ project.description[:100] }}{% if project.description|length > 100 %}...{% endif %} + {% endif %} + |
+ + {% if project.status == 'active' %} + Active + {% else %} + Archived + {% endif %} + | +{{ "%.1f"|format(project.total_hours) }}h | ++ {% if project.billable %} + {{ "%.1f"|format(project.total_billable_hours) }}h + {% else %} + - + {% endif %} + | ++ + View + + | +
Choose a descriptive name that clearly identifies the project.
+ +Optional client name for organization. You can group projects by client.
+ +Provide details about the project scope, objectives, or any relevant information.
+ +Check this if time spent on this project should be tracked for billing purposes.
+ +Set the hourly rate for billable time. Leave empty for non-billable projects.
+ +Optional reference number or code for billing systems.
+ +Active projects can have time tracked. Archived projects are hidden from timers but retain data.
+| Project | +Client | +Status | +Total Hours | +Billable Hours | +Rate | +Actions | +
|---|---|---|---|---|---|---|
|
+
+ {{ project.name }}
+ {% if project.description %}
+
+ {{ project.description[:100] }}{% if project.description|length > 100 %}...{% endif %} + {% endif %} + |
+ + {% if project.client %} + + {{ project.client }} + + {% else %} + - + {% endif %} + | ++ {% if project.status == 'active' %} + Active + {% else %} + Archived + {% endif %} + | ++ {{ "%.1f"|format(project.total_hours) }}h + | ++ {% if project.billable %} + {{ "%.1f"|format(project.total_billable_hours) }}h + {% else %} + - + {% endif %} + | ++ {% if project.billable and project.hourly_rate %} + {{ currency }} {{ "%.2f"|format(project.hourly_rate) }} + {% else %} + - + {% endif %} + | ++ + | +
+ {% if request.args.get('status') or request.args.get('client') or request.args.get('search') %} + Try adjusting your filters or + view all projects. + {% else %} + {% if current_user.is_admin %} + Get started by creating your first project. + {% else %} + No projects have been created yet. + {% endif %} + {% endif %} +
+ {% if current_user.is_admin and not (request.args.get('status') or request.args.get('client') or request.args.get('search')) %} + + Create First Project + + {% endif %} +{{ project.description }}
+| User | +Date | +Time | +Duration | +Notes | +Tags | +Billable | +Actions | +
|---|---|---|---|---|---|---|---|
| {{ entry.user.username }} | +{{ entry.start_utc.strftime('%Y-%m-%d') }} | ++ {{ entry.start_utc.strftime('%H:%M') }} - + {% if entry.end_utc %} + {{ entry.end_utc.strftime('%H:%M') }} + {% else %} + Running + {% endif %} + | ++ {{ entry.duration_formatted }} + | ++ {% if entry.notes %} + {{ entry.notes[:50] }}{% if entry.notes|length > 50 %}...{% endif %} + {% else %} + - + {% endif %} + | ++ {% if entry.tag_list %} + {% for tag in entry.tag_list %} + {{ tag }} + {% endfor %} + {% else %} + - + {% endif %} + | ++ {% if entry.billable %} + Yes + {% else %} + No + {% endif %} + | +
+
+
+
+
+ {% if current_user.is_admin or entry.user_id == current_user.id %}
+
+ {% endif %}
+
+ |
+
Total Hours
+Billable Hours
+Active Projects
+Users
+Generate detailed reports by project with time breakdowns and user statistics.
+ +View time tracking statistics by user with project breakdowns and productivity metrics.
+Get an overview of key metrics including total hours, billable amounts, and trends.
+ +Export time entries to CSV format for external analysis or backup purposes.
+| User | +Project | +Date | +Duration | +Notes | +Billable | +
|---|---|---|---|---|---|
| {{ entry.user.username }} | ++ + {{ entry.project.name }} + + | +{{ entry.start_utc.strftime('%Y-%m-%d') }} | ++ {{ entry.duration_formatted }} + | ++ {% if entry.notes %} + {{ entry.notes[:50] }}{% if entry.notes|length > 50 %}...{% endif %} + {% else %} + - + {% endif %} + | ++ {% if entry.billable %} + Yes + {% else %} + No + {% endif %} + | +
No time entries have been recorded recently.
+Total Hours
+Billable Hours
+Billable Amount
+Projects
+| Project | +Client | +Total Hours | +Billable Hours | +Billable Amount | +Users | +Actions | +
|---|---|---|---|---|---|---|
|
+
+ {{ project.name }}
+ {% if project.description %}
+
+ {{ project.description[:50] }}{% if project.description|length > 50 %}...{% endif %} + {% endif %} + |
+ + {% if project.client %} + {{ project.client }} + {% else %} + - + {% endif %} + | ++ {{ "%.1f"|format(project.total_hours) }}h + | ++ {% if project.billable %} + {{ "%.1f"|format(project.billable_hours) }}h + {% else %} + - + {% endif %} + | ++ {% if project.billable and project.billable_amount > 0 %} + {{ currency }} {{ "%.2f"|format(project.billable_amount) }} + {% else %} + - + {% endif %} + | +
+
+ {% for user_total in project.user_totals %}
+
+ {{ user_total.username }}: {{ "%.1f"|format(user_total.hours) }}h
+
+ {% endfor %}
+
+ |
+ + + | +
+ {% if request.args.get('start_date') or request.args.get('end_date') or request.args.get('project_id') or request.args.get('user_id') %} + Try adjusting your filters or + view all projects. + {% else %} + No time entries have been recorded yet. + {% endif %} +
+| User | +Project | +Date | +Time | +Duration | +Notes | +Tags | +Billable | +
|---|---|---|---|---|---|---|---|
| {{ entry.user.username }} | ++ + {{ entry.project.name }} + + | +{{ entry.start_utc.strftime('%Y-%m-%d') }} | ++ {{ entry.start_utc.strftime('%H:%M') }} - + {% if entry.end_utc %} + {{ entry.end_utc.strftime('%H:%M') }} + {% else %} + Running + {% endif %} + | ++ {{ entry.duration_formatted }} + | ++ {% if entry.notes %} + {{ entry.notes[:50] }}{% if entry.notes|length > 50 %}...{% endif %} + {% else %} + - + {% endif %} + | ++ {% if entry.tag_list %} + {% for tag in entry.tag_list %} + {{ tag }} + {% endfor %} + {% else %} + - + {% endif %} + | ++ {% if entry.billable %} + Yes + {% else %} + No + {% endif %} + | +
Today
+Last 7 Days
+Last 30 Days
+| Project | +Client | +Total Hours | +
|---|---|---|
| + + {{ item.project.name }} + + | +{{ item.project.client }} | +{{ "%.1f"|format(item.hours) }}h | +
No time entries available for the selected period.
+Total Hours
+Billable Hours
+Users
+Projects
+| User | +Total Hours | +Billable Hours | +
|---|---|---|
| {{ username }} | +{{ "%.1f"|format(totals.hours) }}h | ++ {% if totals.billable_hours > 0 %} + {{ "%.1f"|format(totals.billable_hours) }}h + {% else %} + - + {% endif %} + | +
Try adjusting your filters.
+| User | +Project | +Date | +Time | +Duration | +Notes | +Tags | +Billable | +
|---|---|---|---|---|---|---|---|
| {{ entry.user.username }} | ++ + {{ entry.project.name }} + + | +{{ entry.start_utc.strftime('%Y-%m-%d') }} | ++ {{ entry.start_utc.strftime('%H:%M') }} - + {% if entry.end_utc %} + {{ entry.end_utc.strftime('%H:%M') }} + {% else %} + Running + {% endif %} + | ++ {{ entry.duration_formatted }} + | ++ {% if entry.notes %} + {{ entry.notes[:50] }}{% if entry.notes|length > 50 %}...{% endif %} + {% else %} + - + {% endif %} + | ++ {% if entry.tag_list %} + {% for tag in entry.tag_list %} + {{ tag }} + {% endfor %} + {% else %} + - + {% endif %} + | ++ {% if entry.billable %} + Yes + {% else %} + No + {% endif %} + | +
Track your time with precision
+Start a timer to begin tracking your time effectively.
+ +