mirror of
https://github.com/DRYTRIX/TimeTracker.git
synced 2026-05-23 06:40:53 -05:00
905f6fbd37
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.
339 lines
9.9 KiB
Markdown
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
|
|
|