This document describes how TimeTracker collects, uses, and protects data through its analytics and telemetry features.
TimeTracker is designed with privacy as a core principle. All analytics features are either:
- Local-only (structured logging)
- Self-hosted (Prometheus metrics)
- Optional and opt-in (Grafana OTLP detailed analytics, Sentry)
Logs are stored locally on your server only in logs/app.jsonl.
Data collected:
- Request timestamps and durations
- HTTP methods and response codes
- Endpoint paths
- User IDs (internal database references)
- Error messages and stack traces
- Request IDs for tracing
Not collected:
- Passwords or authentication tokens
- Email addresses
- Personal notes or time entry descriptions
- IP addresses (unless explicitly configured in your logging setup)
Storage: Local filesystem only
Retention: Based on your logrotate configuration
Access: Only system administrators with access to the server
Metrics are exposed at /metrics endpoint for scraping by your Prometheus server.
Data collected:
- Request counts by endpoint and status code
- Request latency histograms
- Active timer counts
- Database connection pool metrics
Not collected:
- User-identifying information
- Personal data
- Business data
Storage: Your Prometheus server
Retention: Based on your Prometheus configuration
Access: Only users with access to your Prometheus/Grafana instance
Default: Disabled
Enable by setting: SENTRY_DSN
When enabled, sends error reports to Sentry.
Data collected:
- Error messages and stack traces
- Request context (URL, method, headers)
- User ID (internal reference)
- Application version
- Server environment information
Not collected:
- Passwords or tokens
- Request/response bodies (by default)
- Email addresses (unless in error message)
Storage: Sentry servers (or your self-hosted Sentry instance)
Retention: Based on your Sentry plan (typically 90 days)
Access: Team members with Sentry access
Purpose: Install footprint and distribution (version, platform, active installs).
Data collected (no PII):
- Install ID (random UUID), app version, platform, OS version, architecture
- Locale, timezone, deployment type, first/last seen, heartbeat timestamp
Not collected: Raw IP (stored), email, usernames, feature usage, paths, business data
Storage: Grafana OTLP sink (if configured)
Retention: Recommend 12 months
Access: Product/ops for install analytics
Default: Disabled (user must opt in via Admin β Privacy & Analytics)
Requires: OTLP endpoint/token configured and user enabling "detailed analytics"
When opted in, tracks product usage and feature adoption.
Data collected:
- Event names (e.g. "timer.started", "project.created"), internal user ID, install_id
- Feature usage metadata, session context, page views (pathnames)
Not collected: Email, usernames, time entry content, client/project names, stored IP
Storage: Grafana Cloud OTLP backend (or self-hosted OTLP receiver)
Retention: Per your Grafana retention policy
Access: Team members with Grafana access
Consent: You can turn detailed analytics off anytime in Admin β Settings or Admin β Telemetry. Base telemetry (minimal) continues; no product events are sent when opted out.
The telemetry fingerprint is generated as:
SHA256(server_hostname + TELE_SALT)
- Cannot be reversed to identify the server
- Unique per installation
- Changes if
TELE_SALTchanges - No correlation to user data
All analytics use internal database IDs (integers), never:
- Email addresses
- Usernames
- Real names
- External identifiers
When you enable optional services, data is sent to:
| Service | Data Sent | Purpose | Control |
|---|---|---|---|
| Sentry | Errors, request context | Error monitoring | Set SENTRY_DSN |
| Grafana OTLP | Base telemetry + product events | Product analytics | Set GRAFANA_OTLP_ENDPOINT and GRAFANA_OTLP_TOKEN |
You can self-host all optional services:
- Sentry: https://develop.sentry.dev/self-hosted/
- Grafana/OTLP receiver: Use Grafana Cloud or self-host an OTLP-compatible receiver
- Prometheus: Already self-hosted by default
TimeTracker is designed to be GDPR-compliant. You have the right to:
- Logs: Access files in
logs/directory - Metrics: Query your Prometheus instance
- Sentry: Export data from Sentry UI
- Grafana telemetry: Export/query from Grafana stack
Contact your TimeTracker administrator to correct inaccurate data.
To delete your data:
# Delete logs
rm -f logs/app.jsonl*Data automatically expires based on retention settings.
Use Sentry's data deletion features or contact support.
Use your Grafana data retention/deletion policy and tooling.
Set ENABLE_TELEMETRY=false to stop sending data. To delete existing telemetry data, contact the telemetry service operator with your fingerprint hash.
All data can be exported:
- Logs: Copy files from
logs/directory - Metrics: Query and export from Prometheus
- Sentry: Use Sentry export features
- Grafana telemetry: Use Grafana export/query features
To opt out of all optional analytics:
# .env file
SENTRY_DSN=
GRAFANA_OTLP_ENDPOINT=
GRAFANA_OTLP_TOKEN=
ENABLE_TELEMETRY=false- Logs: Local filesystem only (no transit)
- Metrics: Scraped via HTTP/HTTPS (configure TLS in Prometheus)
- Sentry: HTTPS only
- Grafana OTLP: HTTPS only
- Telemetry: HTTPS only
- Logs: Protected by filesystem permissions (use encryption at rest if required)
- Metrics: Protected by Prometheus access controls
- Sentry: Protected by Sentry (encrypted at rest)
- Grafana telemetry: Protected by your Grafana backend
- Logs: Require server filesystem access
- Metrics: Require Prometheus/Grafana access
- Sentry: Require Sentry account with appropriate permissions
- Grafana telemetry: Require Grafana account with appropriate permissions
TimeTracker follows data minimization principles:
- Only collect what's necessary for functionality or debugging
- No PII in events unless absolutely required
- Aggregate when possible instead of individual records
- Short retention periods for detailed logs
- Local-first storage when possible
- Installation telemetry (
ENABLE_TELEMETRY) - Product analytics sink (
GRAFANA_OTLP_ENDPOINT+GRAFANA_OTLP_TOKEN) - Error monitoring (
SENTRY_DSN)
- Local logs (essential for operation)
- Prometheus metrics (essential for monitoring)
- This documentation is always available
- Configuration is explicit in environment variables
- No hidden data collection
TimeTracker is not intended for use by children under 16. We do not knowingly collect data from children.
If you enable optional services hosted outside your region:
- Sentry: Data may be transferred to US/EU Sentry servers
- Grafana telemetry: Data location depends on your Grafana region/stack
Use self-hosted instances to keep data in your region.
This privacy policy may be updated. Changes will be:
- Documented in git commit history
- Announced in release notes
- Reflected in this document
Last updated: 2025-10-20
For privacy-related questions:
- Check this documentation
- Contact your TimeTracker administrator
- For SaaS deployments, contact the service provider
| Regulation | Status | Notes |
|---|---|---|
| GDPR | Compliant | Supports all data subject rights |
| CCPA | Compliant | Opt-out available for all optional features |
| HIPAA | Not applicable | TimeTracker is not a healthcare application |
| SOC 2 | Depends on deployment | Use encrypted logs, secure credentials |
You can disable optional analytics (Sentry and detailed telemetry). Local logs and Prometheus metrics are essential for operation but stay on your infrastructure.
- Logs: Your server's filesystem
- Metrics: Your Prometheus server
- Optional services: Depends on your configuration (self-hosted or cloud)
Only if you:
- Enable optional cloud services (Sentry, Grafana OTLP)
- Grant them access to your infrastructure
Self-hosted deployments are completely private.
# Stop application
docker-compose down
# Delete logs
rm -rf logs/*.jsonl*
# Remove optional service configurations
# Edit .env and remove:
# - SENTRY_DSN
# - GRAFANA_OTLP_ENDPOINT
# - GRAFANA_OTLP_TOKEN
# - ENABLE_TELEMETRY
# Restart application
docker-compose up -dNo. Analytics collect:
- Usage patterns (which features are used)
- Technical metrics (performance, errors)
- User IDs (internal references only)
Not collected:
- Project names or descriptions
- Time entry descriptions
- Client information
- Invoice details
- Task descriptions
Version: 1.0
Effective Date: 2025-10-20
Document Owner: Privacy & Security Team