Productivity intermediate ⏱ 45 minutes

Kimai: Time Tracking Application

Professional time tracking with reporting. Projects, clients, and invoice generation.

By Homelab Team • 2025-01-15
#kimai#time-tracking#projects#invoicing#docker

Introduction

Kimai is a professional time tracking application designed for freelancers, agencies, and organizations. Built with Symfony and PHP, it provides comprehensive time tracking, project management, client billing, and detailed reporting capabilities. With Kimai, you can track work hours, generate invoices, manage teams, and gain insights into project profitability.

By the end of this guide, you’ll have a production-ready Kimai installation that:

  • Tracks time across multiple projects and clients
  • Supports unlimited users and teams
  • Generates professional invoices and reports
  • Provides detailed analytics and profitability insights
  • Offers mobile-friendly interface with timer controls
  • Includes API access for integrations
  • Features customizable rates and billing periods

Prerequisites

Before starting, ensure you have:

  • A Linux server with at least 1GB RAM (2GB recommended)
  • Docker and Docker Compose installed
  • A domain name or subdomain (e.g., time.yourdomain.com)
  • Basic understanding of Docker and web servers
  • At least 5GB free disk space
  • Root or sudo access

Why Use Kimai?

Professional Time Tracking

Kimai offers enterprise-level features:

  • Multiple timers running simultaneously
  • Start/stop tracking with one click
  • Manual time entry and corrections
  • Lock completed timesheets
  • Approval workflows for team time
  • Time rounding rules
  • Break time tracking

Project and Client Management

Organize work effectively:

  • Unlimited projects and clients
  • Project budgets and time limits
  • Hierarchical project structure
  • Activity-based time tracking
  • Color coding and tags
  • Project templates
  • Archived project management

Invoicing and Billing

Generate professional invoices:

  • Multiple rate types (hourly, fixed, daily)
  • Client-specific rates
  • User-specific rates
  • Project-based rates
  • Activity-based rates
  • Invoice templates
  • Export to PDF
  • Multi-currency support

Reporting and Analytics

Gain insights into your business:

  • Time reports by project, user, client
  • Profitability analysis
  • Budget tracking
  • Export to Excel, PDF, HTML
  • Custom report templates
  • Dashboard widgets
  • Weekly and monthly summaries

Architecture Overview

Our deployment consists of:

  1. Kimai Application: PHP-based web application
  2. MariaDB Database: Stores all time tracking data
  3. Nginx/Apache: Web server (included in container)
  4. Redis (Optional): Session and cache storage
  5. Reverse Proxy: For HTTPS and domain routing

Data flow:

  • Users access Kimai via web browser or mobile
  • Kimai processes requests and stores data in MariaDB
  • Time entries, projects, and clients stored in database
  • Reports generated on-demand
  • API endpoints for integrations

Directory Structure Setup

Create the necessary directory structure:

mkdir -p ~/kimai/{data,database,nginx,backups}
cd ~/kimai

Create subdirectories:

mkdir -p data/{public,var,plugins}
mkdir -p database/mysql

Docker Compose Configuration

Create a docker-compose.yml file:

version: '3.8'

services:
  database:
    image: mariadb:10.11
    container_name: kimai_db
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: kimai
      MYSQL_USER: kimaiuser
      MYSQL_PASSWORD: changeme_secure_password
      MYSQL_ROOT_PASSWORD: changeme_root_password
    volumes:
      - ./database/mysql:/var/lib/mysql
    networks:
      - kimai_net
    command: --default-storage-engine=innodb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 30s
      timeout: 10s
      retries: 3

  kimai:
    image: kimai/kimai2:apache
    container_name: kimai
    restart: unless-stopped
    depends_on:
      - database
    environment:
      DATABASE_URL: mysql://kimaiuser:changeme_secure_password@database/kimai?charset=utf8mb4&serverVersion=10.11.0-MariaDB
      TRUSTED_HOSTS: localhost,127.0.0.1,time.yourdomain.com
      APP_ENV: prod
      APP_SECRET: change_this_to_something_unique_and_secret
      MAILER_FROM: [email protected]
      MAILER_URL: smtp://smtp.gmail.com:587?encryption=tls&auth_mode=login&[email protected]&password=your-app-password
      ADMINMAIL: [email protected]
      ADMINPASS: changeme_admin_password
    volumes:
      - ./data/var:/opt/kimai/var
      - ./data/public:/opt/kimai/public
      - ./data/plugins:/opt/kimai/var/plugins
    ports:
      - "8001:8001"
    networks:
      - kimai_net
    healthcheck:
      test: ["CMD", "wget", "-q", "--spider", "http://localhost:8001/health"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  kimai_net:
    driver: bridge

Important Configuration Notes:

  1. Change all passwords to secure values:

    # Generate secure passwords
    openssl rand -base64 32
  2. Generate APP_SECRET:

    openssl rand -hex 32
  3. Update TRUSTED_HOSTS with your actual domain

  4. Configure MAILER_URL for email notifications (optional)

  5. Set strong ADMINPASS for initial admin account

Environment Configuration

Create a .env file for easier configuration:

# Database Configuration
MYSQL_DATABASE=kimai
MYSQL_USER=kimaiuser
MYSQL_PASSWORD=your_secure_db_password
MYSQL_ROOT_PASSWORD=your_secure_root_password

# Kimai Configuration
KIMAI_DOMAIN=time.yourdomain.com
APP_SECRET=your_generated_app_secret
[email protected]
ADMIN_PASSWORD=your_secure_admin_password

# Email Configuration
[email protected]
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
[email protected]
SMTP_PASSWORD=your-app-password

Starting Kimai

Start all services:

docker-compose up -d

Wait for containers to be healthy (may take 1-2 minutes):

docker-compose ps

Check logs:

docker-compose logs -f kimai

Watch for:

  • “Database migration completed”
  • “Admin user created”
  • “Apache started”

Initial Setup and Configuration

Access Kimai

Navigate to http://YOUR-SERVER-IP:8001 or http://time.yourdomain.com:8001

You should see the Kimai login page.

First Login

Login with default credentials:

Change Admin Password

  1. Click your username (top right) → Profile
  2. Edit → Password tab
  3. Enter current password
  4. Enter new strong password (min 8 chars)
  5. Save changes

Configure System Settings

Navigate to System → Settings:

General Settings:

  • Application Title: “Your Company Time Tracking”
  • Default Currency: USD (or your currency)
  • Default Country: Your country
  • Default Language: English

Time Tracking Settings:

  • Default Begin Time: 09:00 (or your typical start)
  • Rounding: Enable if needed (e.g., round to 15-minute intervals)
  • Allow future times: Disable for accuracy
  • Time tracking mode: Duration (recommended for most users)

Calendar Settings:

  • First day of week: Monday (or Sunday)
  • Working days: Monday-Friday
  • Business hours: 09:00-17:00

Configure Email Settings

System → Settings → Email:

SMTP Configuration:

  • From Address: [email protected]
  • From Name: Kimai Time Tracker
  • Test by sending a test email

Setting Up Reverse Proxy with Caddy

Create a Caddyfile for HTTPS access:

mkdir -p ~/kimai/caddy

Create caddy/Caddyfile:

time.yourdomain.com {
    encode gzip

    reverse_proxy kimai:8001 {
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto {scheme}
    }

    # Security headers
    header {
        Strict-Transport-Security "max-age=31536000; includeSubDomains"
        X-Content-Type-Options "nosniff"
        X-Frame-Options "SAMEORIGIN"
        X-XSS-Protection "1; mode=block"
        Referrer-Policy "strict-origin-when-cross-origin"
    }

    log {
        output file /data/access.log
        format json
    }
}

Add Caddy to docker-compose.yml:

  caddy:
    image: caddy:latest
    container_name: kimai_caddy
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy/config:/config
      - ./caddy/data:/data
    networks:
      - kimai_net
    depends_on:
      - kimai

Restart services:

docker-compose up -d

Access Kimai at https://time.yourdomain.com

Client Management

Adding Clients

Navigate to Clients → Create Client:

Client Details:

  • Name: Client Company Name
  • Number: Client ID (e.g., CL-001)
  • Address: Full address
  • Country: Client country
  • Currency: Billing currency
  • Phone: Contact number
  • Email: Billing email
  • Homepage: Client website
  • Time budget: Monthly hours limit (optional)
  • Budget: Monthly budget amount (optional)
  • Color: Visual identifier

Client Settings:

  • Visible: Yes (active client)
  • Billable: Yes (for invoicing)
  • Comment: Internal notes

Client Organization

Group clients by:

  • Industry type
  • Project size
  • Billing frequency
  • Geographic location

Use color coding for quick identification:

  • Green: Active, on-budget
  • Yellow: Approaching budget limit
  • Red: Over budget or past due

Project Setup

Creating Projects

Navigate to Projects → Create Project:

Project Basics:

  • Name: Project name
  • Customer: Select client
  • Project Number: Unique ID (e.g., PRJ-2025-001)
  • Order Number: Client’s PO number
  • Color: Visual identifier

Project Details:

  • Project Start: Start date
  • Project End: Deadline (optional)
  • Comment: Project description
  • Time budget: Total hours allocated
  • Budget: Total cost budget
  • Order date: When project was approved

Project Settings:

  • Visible: Yes (active)
  • Billable: Yes (for invoicing)
  • Global activities: Allow or restrict
  • Time budget type: Total, monthly, yearly

Project Templates

Create templates for recurring projects:

  1. Create a project with standard activities
  2. Set default rates
  3. Configure budget templates
  4. Use as template for new projects

Project Activities

Add activities to projects:

Navigate to Activities → Create Activity:

Activity Types:

  • Development
  • Design
  • Meeting
  • Research
  • Documentation
  • Testing
  • Support
  • Administration

Activity Configuration:

  • Name: Activity name
  • Comment: Description
  • Color: Visual identifier
  • Visible: Yes
  • Billable: Yes/No
  • Fixed rate: Override project rate (optional)
  • Budget: Activity-specific budget

Time Tracking

Start Tracking Time

Method 1: Quick Timer:

  1. Dashboard → Start button
  2. Select Project
  3. Select Activity
  4. Timer starts automatically
  5. Work on task
  6. Click Stop when done

Method 2: Manual Entry:

  1. Timesheets → Create Entry
  2. Select Date
  3. Select Project and Activity
  4. Enter Start Time
  5. Enter End Time (or Duration)
  6. Add Description
  7. Save

Method 3: Restart Previous:

  1. Timesheets → Recent entries
  2. Click Restart icon
  3. Timer starts with same project/activity

Time Entry Details

Add detailed information:

Required Fields:

  • Project
  • Activity
  • Date
  • Duration or Start/End time

Optional Fields:

  • Description: What you worked on
  • Tags: Categorize entries
  • Billable: Override project setting
  • Hourly rate: Override default rate
  • Fixed rate: Use fixed amount instead

Multiple Timers

Run multiple timers simultaneously:

  1. Start timer for Project A
  2. Switch to Project B → Start new timer
  3. Project A continues in background
  4. Stop Project B timer
  5. Return to Project A timer

View all active timers in dashboard widget.

Editing Time Entries

Modify existing entries:

  1. Timesheets → Find entry
  2. Click Edit icon
  3. Modify fields
  4. Save changes

Locked Entries:

  • Cannot be edited without unlocking
  • Admins can unlock via System → Timesheets

Rate Configuration

Hourly Rates

Set up billing rates at multiple levels:

User-Level Rates:

  1. Users → Edit User → Rates
  2. Add hourly rate
  3. Optional: Date range for rate changes

Project-Level Rates:

  1. Projects → Edit Project → Rates
  2. Add hourly rate (overrides user rate)

Activity-Level Rates:

  1. Activities → Edit Activity → Fixed Rate
  2. Set specific rate for this activity

Client-Level Rates:

  1. Clients → Edit Client → Rates
  2. Set default rate for all projects

Rate Priority:

  1. Activity fixed rate (highest)
  2. Activity hourly rate
  3. Project rate
  4. Customer rate
  5. User rate (lowest)

Fixed Rates

Use fixed rates for:

  • Flat-fee tasks
  • Package deals
  • Specific deliverables

Configure in Activity settings.

Rate Changes

Handle rate increases:

  1. Edit existing rate → Set end date
  2. Create new rate → Set start date
  3. Historical entries maintain original rates
  4. New entries use current rate

Team Management

Adding Team Members

Navigate to Users → Create User:

User Details:

  • Username: unique login
  • Email: for notifications
  • Alias: Display name
  • Title: Job title
  • Password: Initial password
  • Enabled: Yes

User Roles:

  • ROLE_SUPER_ADMIN: Full system access
  • ROLE_ADMIN: Manage users and settings
  • ROLE_TEAMLEAD: Approve team timesheets
  • ROLE_USER: Regular time tracking

User Settings:

  • Language: Interface language
  • Timezone: User’s timezone
  • Hourly rate: Default billing rate
  • Color: Visual identifier

Team Permissions

Configure access control:

Project Permissions:

  • Assign users to specific projects
  • Set visibility per project
  • Control who can see project data

Team Visibility:

  • Users see only their projects
  • Team leads see their team
  • Admins see everything

Team Workflows

Set up approval workflows:

  1. Users submit timesheets
  2. Team lead reviews entries
  3. Approve or request changes
  4. Lock approved timesheets
  5. Generate invoices from approved time

Reporting and Analytics

Time Reports

Generate comprehensive reports:

Navigate to Reports → Time Reports:

Report Filters:

  • Date range: Custom, This week, This month, Last month
  • Users: All or specific users
  • Clients: All or specific clients
  • Projects: All or specific projects
  • Activities: Filter by activity type
  • Tags: Filter by tags
  • Billable: Billable, Non-billable, or All

Report Views:

  • Summary: Total hours and revenue
  • By user: Time per team member
  • By customer: Time per client
  • By project: Time per project
  • By activity: Time per activity type
  • Daily: Daily breakdown
  • Monthly: Monthly aggregates

Export Formats:

  • Excel (.xlsx)
  • PDF document
  • CSV data
  • HTML page
  • JSON data

Budget Tracking

Monitor project budgets:

Dashboard → Budget widgets:

Budget Types:

  • Time budget: Hours allocated vs. used
  • Money budget: Budget vs. actual cost
  • Customer budget: Client spending limits

Budget Alerts:

  • Yellow: 75% budget consumed
  • Red: 90% budget consumed
  • Alert: Budget exceeded

Budget Reports:

  1. Reports → Budget Report
  2. Select date range
  3. Filter by client/project
  4. View utilization percentages
  5. Identify over-budget projects

Profitability Analysis

Analyze project profitability:

Calculate profit margins:

  • Revenue: Billable hours × rates
  • Costs: Actual hours × internal costs
  • Profit: Revenue - Costs
  • Margin: (Profit / Revenue) × 100

Profitability Report:

  1. Configure internal cost rates
  2. Set billing rates
  3. Generate profitability report
  4. Identify most/least profitable projects
  5. Adjust rates or scope accordingly

Dashboard Widgets

Customize your dashboard:

Available widgets:

  • Active timers
  • Recent activities
  • Working time
  • Budget stats
  • Project stats
  • User stats
  • Calendar
  • My team

Configure:

  1. Dashboard → Add Widget
  2. Select widget type
  3. Configure filters
  4. Arrange layout

Invoicing

Invoice Templates

Configure invoice templates:

System → Invoice Templates:

Template Settings:

  • Template name
  • Number format: INV-YYYY-MM-001
  • Company details
  • Payment terms: Net 30, Net 15, Due on receipt
  • Tax settings
  • Footer text

Invoice Content:

  • Company logo
  • Invoice number
  • Invoice date
  • Due date
  • Client details
  • Line items (time entries)
  • Subtotal
  • Tax amount
  • Total amount
  • Payment instructions

Creating Invoices

Generate invoices from time entries:

Navigate to Invoices → Create Invoice:

  1. Select date range
  2. Select client
  3. Select projects (optional)
  4. Select template
  5. Preview invoice
  6. Adjust line items if needed
  7. Generate PDF
  8. Mark as sent
  9. Track payment status

Invoice Statuses:

  • New: Just created
  • Pending: Sent to client
  • Paid: Payment received
  • Canceled: Voided invoice

Invoice Management

Track and manage invoices:

Invoice List:

  • Filter by status, client, date
  • Search by invoice number
  • Sort by due date
  • View aging report

Payment Tracking:

  1. Receive payment
  2. Open invoice
  3. Mark as paid
  4. Record payment date
  5. Add payment notes

Recurring Invoices

Set up automatic billing:

  1. Create invoice template
  2. Set recurrence: Weekly, Monthly, Quarterly, Yearly
  3. Define start and end dates
  4. System generates invoices automatically
  5. Review and send

API Integration

Enable API Access

Navigate to User Profile → API:

Generate API Token:

  1. Profile → API
  2. Click “Generate API Password”
  3. Copy token securely
  4. Use for authentication

API Token Security:

  • Treat like a password
  • Store securely
  • Rotate regularly
  • Revoke if compromised

API Endpoints

Kimai provides REST API for:

Time Entries:

  • GET /api/timesheets - List entries
  • POST /api/timesheets - Create entry
  • PATCH /api/timesheets/ID - Update entry
  • DELETE /api/timesheets/ID - Delete entry

Projects:

  • GET /api/projects - List projects
  • POST /api/projects - Create project
  • GET /api/projects/ID - Get details

Customers:

  • GET /api/customers - List clients
  • POST /api/customers - Create client

Activities:

  • GET /api/activities - List activities

API Authentication:

curl -X GET "https://time.yourdomain.com/api/timesheets"   -H "X-AUTH-USER: [email protected]"   -H "X-AUTH-TOKEN: your_api_token"

Integration Examples

Start Timer via API:

curl -X POST "https://time.yourdomain.com/api/timesheets"   -H "X-AUTH-USER: [email protected]"   -H "X-AUTH-TOKEN: your_api_token"   -H "Content-Type: application/json"   -d '{
    "project": 1,
    "activity": 2,
    "begin": "2025-01-15T09:00:00"
  }'

Stop Timer:

curl -X PATCH "https://time.yourdomain.com/api/timesheets/123"   -H "X-AUTH-USER: [email protected]"   -H "X-AUTH-TOKEN: your_api_token"   -H "Content-Type: application/json"   -d '{
    "end": "2025-01-15T17:00:00"
  }'

Get Today’s Entries:

curl -X GET "https://time.yourdomain.com/api/timesheets?begin=2025-01-15&end=2025-01-15"   -H "X-AUTH-USER: [email protected]"   -H "X-AUTH-TOKEN: your_api_token"

Backup and Restore

Backup Strategy

Create automated backups:

Create scripts/backup-kimai.sh:

#!/bin/bash

BACKUP_DIR="./backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_NAME="kimai_backup_$TIMESTAMP"

mkdir -p "$BACKUP_DIR"

echo "Backing up Kimai database..."
docker exec kimai_db mysqldump -u root -p"$MYSQL_ROOT_PASSWORD" kimai > "$BACKUP_DIR/$BACKUP_NAME.sql"

echo "Backing up Kimai data..."
tar -czf "$BACKUP_DIR/$BACKUP_NAME.tar.gz" -C ./data .

echo "Backing up configuration..."
cp docker-compose.yml "$BACKUP_DIR/docker-compose_$TIMESTAMP.yml"

# Keep only last 30 backups
ls -t "$BACKUP_DIR"/kimai_backup_*.sql | tail -n +31 | xargs -r rm
ls -t "$BACKUP_DIR"/kimai_backup_*.tar.gz | tail -n +31 | xargs -r rm

echo "Backup completed: $BACKUP_DIR/$BACKUP_NAME.*"

Make executable:

chmod +x scripts/backup-kimai.sh

Automated Backups

Schedule with cron:

crontab -e

Add daily backup at 2 AM:

0 2 * * * cd /path/to/kimai && ./scripts/backup-kimai.sh >> ./backups/backup.log 2>&1

Restore Procedure

Create scripts/restore-kimai.sh:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: $0 backup_name (without extension)"
    exit 1
fi

BACKUP_NAME="$1"

echo "Stopping Kimai..."
docker-compose down

echo "Restoring database..."
docker-compose up -d database
sleep 10
cat "./backups/$BACKUP_NAME.sql" | docker exec -i kimai_db mysql -u root -p"$MYSQL_ROOT_PASSWORD" kimai

echo "Restoring data files..."
rm -rf ./data/*
tar -xzf "./backups/$BACKUP_NAME.tar.gz" -C ./data

echo "Starting Kimai..."
docker-compose up -d

echo "Restore completed!"

Make executable:

chmod +x scripts/restore-kimai.sh

Troubleshooting

Common Issues

Issue: Cannot access Kimai web interface

# Check container status
docker-compose ps

# Check logs
docker-compose logs kimai
docker-compose logs database

# Verify port is accessible
curl http://localhost:8001/health

# Check database connection
docker exec kimai_db mysql -u root -p -e "SHOW DATABASES;"

Issue: Database connection errors

  1. Verify DATABASE_URL in docker-compose.yml
  2. Ensure database container is healthy
  3. Check database credentials
  4. Wait for database initialization (1-2 minutes)
# Test database connectivity
docker exec kimai php bin/console doctrine:query:sql "SELECT 1"

Issue: Timer not starting

  1. Clear browser cache
  2. Check JavaScript console for errors
  3. Verify user has permissions
  4. Ensure project and activity are active
# Check Kimai logs
docker-compose logs kimai | grep -i error

Issue: Email not sending

  1. Verify MAILER_URL in environment
  2. Test SMTP credentials
  3. Check spam folder
  4. Review email logs
# Test email configuration
docker exec kimai php bin/console swiftmailer:email:send [email protected]

Database Maintenance

Check database size:

docker exec kimai_db mysql -u root -p -e "SELECT table_schema AS 'Database', ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)' FROM information_schema.tables WHERE table_schema='kimai' GROUP BY table_schema;"

Optimize database:

docker exec kimai_db mysqlcheck -u root -p --optimize --all-databases

Clear cache:

docker exec kimai php bin/console cache:clear --env=prod
docker exec kimai php bin/console cache:warmup --env=prod

Performance Optimization

Enable opcache: Already enabled in Docker image.

Database indexing: Automatically handled by Kimai migrations.

Increase PHP memory: Add to docker-compose.yml under kimai environment:

      PHP_MEMORY_LIMIT: 256M

Logs and Debugging

View application logs:

docker exec kimai tail -f /opt/kimai/var/log/prod.log

View Apache logs:

docker-compose logs -f kimai

View database logs:

docker-compose logs -f database

Enable debug mode (not recommended for production):

      APP_ENV: dev

Security Best Practices

User Security

  1. Enforce strong passwords
  2. Enable two-factor authentication (if plugin available)
  3. Regular password changes
  4. Limit failed login attempts
  5. Review user access regularly

Application Security

  1. Keep Kimai updated
  2. Use HTTPS only
  3. Disable public registration
  4. Implement IP whitelisting if needed
  5. Regular security audits

Database Security

  1. Use strong database passwords
  2. Disable remote database access
  3. Regular database backups
  4. Encrypt backups
  5. Test restore procedures

Network Security

Configure firewall:

# Allow only HTTPS
sudo ufw allow 443/tcp
sudo ufw allow 80/tcp

# Block direct access to application port
sudo ufw deny 8001/tcp

# Enable firewall
sudo ufw enable

Plugins and Extensions

Available Plugins

Kimai supports various plugins:

Popular Plugins:

  • Expenses: Track project expenses
  • Budgets: Enhanced budget management
  • Custom CSS: Customize appearance
  • Audit Trail: Track all changes
  • Invoice: Extended invoicing features

Installing Plugins

  1. Download plugin to data/plugins/ directory
  2. Extract if necessary
  3. Clear cache:
    docker exec kimai php bin/console cache:clear
    docker exec kimai php bin/console kimai:reload --env=prod
  4. Navigate to System → Plugins
  5. Activate plugin

Custom Branding

Customize Kimai appearance:

  1. Add logo: Place in data/public/images/
  2. Configure in System → Settings → Branding
  3. Upload logo file
  4. Set company colors
  5. Custom CSS for advanced styling

Mobile Access

Mobile Browser

Kimai is mobile-responsive:

  • Access via mobile browser
  • Full timer functionality
  • Quick time entry
  • View reports
  • Mobile-optimized interface

Progressive Web App

Install as PWA:

iOS:

  1. Open in Safari
  2. Tap Share button
  3. Add to Home Screen
  4. Launch as app

Android:

  1. Open in Chrome
  2. Tap menu
  3. Add to Home Screen
  4. Launch as app

Advanced Configuration

Custom Fields

Add custom fields to time entries:

System → Custom Fields:

  1. Create custom field
  2. Field name: e.g., “Ticket Number”
  3. Field type: Text, Number, Date, etc.
  4. Entity: Timesheet
  5. Visible: Yes
  6. Required: Optional
  7. Save

Users can now add ticket numbers to time entries.

Time Rounding

Configure time rounding rules:

System → Settings → Time Rounding:

Options:

  • No rounding
  • Round to 5 minutes
  • Round to 15 minutes
  • Round to 30 minutes
  • Round to 1 hour

Rounding Modes:

  • Round up (begin down, end up)
  • Round down (begin down, end down)
  • Round nearest

Lockdown Times

Prevent editing of old time entries:

System → Settings → Lockdown:

  1. Enable lockdown
  2. Set lockdown period: e.g., 7 days
  3. Entries older than 7 days cannot be edited
  4. Exceptions for admins

Export Formats

Customize export templates:

System → Export:

  1. Create custom export template
  2. Define columns
  3. Set formatting
  4. Save template
  5. Use in reports

Conclusion

You now have a fully functional time tracking system with:

  • Professional time tracking capabilities
  • Comprehensive project and client management
  • Team collaboration features
  • Invoicing and billing automation
  • Detailed reporting and analytics
  • API access for integrations
  • Secure, self-hosted solution

Kimai provides all the tools needed for effective time management, whether you’re a freelancer, small team, or growing agency.

Next Steps

Consider these enhancements:

  • Install additional plugins for extended functionality
  • Set up integrations with project management tools
  • Configure automated reports via email
  • Implement single sign-on with LDAP/OAuth
  • Set up high availability with load balancing
  • Configure monitoring with Prometheus
  • Customize invoice templates with company branding
  • Explore mobile app alternatives for offline tracking

For support and updates, visit: