Writing

Multi-signal attribution in Daymon

  • rust
  • time-tracking
  • attribution

The hardest problem in automatic time tracking isn’t capturing activity — it’s attributing it to the right project. When you switch between a browser tab, a terminal, and an IDE in the span of 30 seconds, which project owns that time?

Daymon solves this with a multi-signal attribution system. Each activity window gets scored against project rules (path patterns, URL patterns, app names, title regex), and the highest-scoring project wins. When signals are ambiguous, the system falls back to file modification context — if you just saved a file in project A, the next 60 seconds of browser activity probably belongs to project A too.

Daymon, today view: a day profile, the sessions of the day and 23 activities still to check
Daymon today: what it recorded, and what it still asks you to check.

The implementation uses pre-compiled regex patterns stored in a RuleMatcher, with configurable priority levels. Rules can be imported/exported as JSON, and templates exist for common project types (React app, Rust crate, Python package, etc.).

The tricky part was reassignment: when you realize attribution was wrong for a past session, the timeline view now supports drag-to-reassign with full propagation of the rule change to prevent the same misattribution in the future.