Files
TimeTracker/docs/privacy.md
T
Dries Peeters 905f6fbd37 feat(telemetry): migrate analytics pipeline from PostHog to OTLP
Switch product and installation telemetry to OTLP/Grafana across runtime config, CI injection, docs, and tests to unify telemetry transport and simplify privacy-focused opt-in behavior.
2026-03-26 17:01:55 +01:00

339 lines
9.9 KiB
Markdown

# Privacy Policy - Analytics & Telemetry
This document describes how TimeTracker collects, uses, and protects data through its analytics and telemetry features.
## Overview
TimeTracker is designed with privacy as a core principle. All analytics features are either:
1. **Local-only** (structured logging)
2. **Self-hosted** (Prometheus metrics)
3. **Optional and opt-in** (Grafana OTLP detailed analytics, Sentry)
## Data Collection
### What We Collect
#### 1. Structured Logs (Always Enabled)
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
#### 2. Prometheus Metrics (Always Enabled, Self-Hosted)
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
#### 3. Error Monitoring (Sentry) - Optional
**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
#### 4. Base Telemetry (Minimal) - Anonymous Installation Telemetry
**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
#### 5. Detailed Analytics (Grafana OTLP) - Optional & Opt-In
**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.
## Anonymization & Hashing
### Installation Fingerprint
The telemetry fingerprint is generated as:
```
SHA256(server_hostname + TELE_SALT)
```
- Cannot be reversed to identify the server
- Unique per installation
- Changes if `TELE_SALT` changes
- No correlation to user data
### User IDs
All analytics use internal database IDs (integers), never:
- Email addresses
- Usernames
- Real names
- External identifiers
## Data Sharing
### Third-Party Services
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` |
### Self-Hosting
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
## Your Rights (GDPR Compliance)
TimeTracker is designed to be GDPR-compliant. You have the right to:
### 1. Access Your Data
- **Logs**: Access files in `logs/` directory
- **Metrics**: Query your Prometheus instance
- **Sentry**: Export data from Sentry UI
- **Grafana telemetry**: Export/query from Grafana stack
### 2. Rectify Your Data
Contact your TimeTracker administrator to correct inaccurate data.
### 3. Erase Your Data
To delete your data:
#### Local Logs
```bash
# Delete logs
rm -f logs/app.jsonl*
```
#### Prometheus
Data automatically expires based on retention settings.
#### Sentry
Use Sentry's data deletion features or contact support.
#### Grafana telemetry
Use your Grafana data retention/deletion policy and tooling.
#### Telemetry
Set `ENABLE_TELEMETRY=false` to stop sending data. To delete existing telemetry data, contact the telemetry service operator with your fingerprint hash.
### 4. Export Your Data
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
### 5. Opt-Out
To opt out of all optional analytics:
```bash
# .env file
SENTRY_DSN=
GRAFANA_OTLP_ENDPOINT=
GRAFANA_OTLP_TOKEN=
ENABLE_TELEMETRY=false
```
## Data Security
### In Transit
- 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
### At Rest
- **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
### Access Controls
- 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
## Data Minimization
TimeTracker follows data minimization principles:
1. **Only collect what's necessary** for functionality or debugging
2. **No PII in events** unless absolutely required
3. **Aggregate when possible** instead of individual records
4. **Short retention** periods for detailed logs
5. **Local-first** storage when possible
## Consent & Transparency
### Explicit Consent Required
- Installation telemetry (`ENABLE_TELEMETRY`)
- Product analytics sink (`GRAFANA_OTLP_ENDPOINT` + `GRAFANA_OTLP_TOKEN`)
- Error monitoring (`SENTRY_DSN`)
### Implicit Consent
- Local logs (essential for operation)
- Prometheus metrics (essential for monitoring)
### Transparency
- This documentation is always available
- Configuration is explicit in environment variables
- No hidden data collection
## Children's Privacy
TimeTracker is not intended for use by children under 16. We do not knowingly collect data from children.
## International Data Transfers
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.
## Changes to This Policy
This privacy policy may be updated. Changes will be:
1. Documented in git commit history
2. Announced in release notes
3. Reflected in this document
Last updated: 2025-10-20
## Contact
For privacy-related questions:
1. Check this documentation
2. Contact your TimeTracker administrator
3. For SaaS deployments, contact the service provider
## Compliance Summary
| 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 |
## Frequently Asked Questions
### Can I disable all analytics?
You can disable optional analytics (Sentry and detailed telemetry). Local logs and Prometheus metrics are essential for operation but stay on your infrastructure.
### Where is my data stored?
- **Logs**: Your server's filesystem
- **Metrics**: Your Prometheus server
- **Optional services**: Depends on your configuration (self-hosted or cloud)
### Can someone else see my data?
Only if you:
1. Enable optional cloud services (Sentry, Grafana OTLP)
2. Grant them access to your infrastructure
Self-hosted deployments are completely private.
### How do I delete all analytics data?
```bash
# 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 -d
```
### Is my business data collected?
No. 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