Daytrace
Daytrace is a privacy-first desktop utility that turns a person's day into a searchable text journal. Screen, microphone, keyboard activity, and system context are independent opt-ins. Captured media is processed ephemerally and discarded; the durable record contains text and structured metadata only.
This repository now includes a headless ActivityWatch summary prototype. The broader cross-platform capture application remains in the product and architecture planning phase.
ActivityWatch workstream digest
The Python CLI reads a selected day from an already-running ActivityWatch instance, sanitizes and fuses its watcher data, and reconstructs project-neutral activity sessions. It can stop there with a fully local deterministic report, or—only when explicitly requested—send the sanitized sessions to OpenAI to infer broad workstreams, topics, and evidence-backed apparent achievements.
DayTrace's inferred workstreams are not canonical project definitions. They are a useful daily handoff that an Obsidian Second Brain plugin can later map to the projects defined in the vault. This keeps DayTrace useful without access to the vault and leaves durable project ownership in Obsidian.
Prerequisites: install and run ActivityWatch, then install uv. On Windows:
winget install --id=astral-sh.uv -e
From a source checkout:
uv sync
uv run daytrace activitywatch --date 2026-09-10 --output daytrace.md
After the package is published, the equivalent one-off workflows are:
# Project-neutral local sessions; no model or key
uvx daytrace activitywatch --date 2026-09-10 --output daytrace.md
# AI-assisted inferred workstreams; key entered in a hidden prompt
uvx daytrace activitywatch --date 2026-09-10 --summary ai `
--provider openai --model YOUR_MODEL --output daytrace.md
# Structured handoff for the future Second Brain plugin
uvx daytrace activitywatch --date 2026-09-10 --summary ai `
--provider openai --model YOUR_MODEL --format json --output daytrace.json
The deterministic mode needs no API key. It emits coherent sessions with exact
active duration while using current-window events as the foreground-time
authority; simultaneous browser and editor events enrich those sessions rather
than double-counting time. Short activity is shown as <1m.
AI mode is a separate second stage. Before any cloud request, DayTrace reports the number of sanitized sessions, request character count, included data categories, provider, and model, then asks for confirmation. Only afterward does it request the OpenAI API key through a hidden prompt. The key is not stored by DayTrace. Never put a key in command-line arguments or paste it into support logs.
The model returns structured data that DayTrace validates locally. Each topic and visible achievement must cite a supplied session, every session must be allocated exactly once, and model-produced text receives another secret scan. Durations always come from the deterministic local trace. If an explicitly requested AI call or response fails, DayTrace writes the deterministic fallback and exits with status 2.
Useful local modes:
--detailsadds sanitized contexts and evidence identifiers.--rawshows sanitized session slices and cannot be combined with--detailsor AI mode.--diagnosticsprints only aggregate, content-free counts and coverage.--format jsonemits a versioned structured artifact suitable for another plugin; Markdown is the default.--yesconfirms the disclosed cloud send for non-interactive AI automation, but the API key is still collected separately through the hidden prompt.
Python callers—including a future second-brain integration—can use the same project-neutral collection and deterministic renderer directly:
from datetime import date
from daytrace.activitywatch import collect_day, summarize_day
bundle = collect_day(date(2026, 9, 10))
markdown = summarize_day(date(2026, 9, 10))
Daytrace reads ActivityWatch through http://127.0.0.1:5600 by default. It
does not retain images, audio, video, raw browser URLs, query strings, source
event IDs, source bucket IDs, or a second copy of ActivityWatch events. Use
--server for another ActivityWatch endpoint and --timezone for an explicit
IANA timezone such as America/Los_Angeles.
Product decisions
- Local-first: the database and processing stay on the user's computer unless the user explicitly configures a cloud provider or export destination.
- All capture sources start off and require separate, informed consent.
- Tauri 2 and Rust are the recommended desktop stack, with a small React/Vite interface that normally stays hidden behind a tray icon.
- Accessibility text is preferred over screenshots. OCR is a fallback, and image buffers are destroyed after extraction.
- Microphone audio is held only in bounded memory, segmented with voice activity detection, transcribed, and discarded.
- Keyboard capture defaults to activity signals only, not key content. An advanced typed-text mode is a later, separately consented feature with password and deny-list suppression.
- SQLite, B-tree time dimensions, and FTS5 provide the hierarchical timeline and full-text search. Captured media and vector embeddings are not stored.
- The first release supports BYOK and local providers. A hosted inference gateway can later fund the project without locking users into the service.
Plan
- Implementation plan
- Architecture
- Data model and search
- Privacy and security
- Product and UX specification
- Screenpipe reuse audit
- ActivityWatch integration research
Proposed repository shape
apps/
desktop/ Tauri window, tray, onboarding, settings
crates/
daytrace-core/ orchestration, policies, domain events
daytrace-capture/ platform-neutral capture traits
daytrace-platform-*/ macOS, Windows, and Linux adapters
daytrace-extract/ accessibility, OCR, VAD, transcription
daytrace-store/ SQLite migrations, FTS, retention
daytrace-summary/ segmentation and provider-neutral summaries
daytrace-sync/ deterministic export and GitHub sync
daytrace-secrets/ OS credential-store abstraction
extensions/
browser/ optional Chromium/Firefox tab metadata bridge
docs/
Target outcome
The v1 release is a signed, auto-updating macOS, Windows, and Linux desktop app that can run for an eight-hour day without retaining raw media, recover cleanly from sleep and device changes, search a local journal, and create an editable end-of-day summary. See the implementation plan for measurable release gates.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file daytrace-0.2.0.tar.gz.
File metadata
- Download URL: daytrace-0.2.0.tar.gz
- Upload date:
- Size: 22.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0c11b2ea93196bf3fddb73bb5eec7c5fd37b17282ae968e0f82225bbbd4e614d
|
|
| MD5 |
e2348010f2259a21c083f27506648820
|
|
| BLAKE2b-256 |
f29e8fcc6ccc77dd8ad7483a99b28c2a386243f78776acd406ad9f6988b7588c
|
File details
Details for the file daytrace-0.2.0-py3-none-any.whl.
File metadata
- Download URL: daytrace-0.2.0-py3-none-any.whl
- Upload date:
- Size: 30.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2e98ded9dbaa674f465384115c353e0885ccfb82e73d54a060541d044cb36b7
|
|
| MD5 |
bd58a8f5f78fa30c5c716816cc3cb76b
|
|
| BLAKE2b-256 |
6480d6fc827c0cb50a66957a2a86cc21a4dc836a67494d766a4fde3e1ab3fbba
|