kimai-plugin-heatmap/.planning/research/FEATURES.md

8.6 KiB

Feature Landscape

Domain: Time-tracking activity heatmap dashboard widget (Kimai plugin) Researched: 2026-04-08 Overall confidence: MEDIUM (based on training data knowledge of GitHub, GitLab, WakaTime, RescueTime, Toggl, and open-source heatmap libraries; no live verification available)

Reference Products Analyzed

Product Heatmap Style Key Insight
GitHub contribution graph Year-long calendar grid, 5 color levels, tooltips The gold standard UX -- simple, instantly understood, no configuration needed
GitLab activity calendar Same layout as GitHub, slightly different color scheme Proves the pattern is universal for developer audiences
WakaTime Calendar heatmap + line charts + breakdowns by language/project Heavier analytics layer on top of the basic heatmap
RescueTime Daily productivity scores, category breakdowns, hour-of-day patterns Focus on productivity categorization, not raw activity
Toggl Track insights Weekly/monthly bar charts, project pie charts, calendar view More report-centric than heatmap-centric
cal-heatmap (JS library) Configurable calendar heatmap, multiple layouts Popular open-source implementation, good API reference

Table Stakes

Features users expect from any calendar heatmap. Missing any of these makes the widget feel broken or incomplete.

Feature Why Expected Complexity Notes
Calendar grid layout (weeks x days) This IS the product -- the GitHub-style grid is the universally recognized pattern Medium d3.js renders SVG grid; each cell = one day
Color intensity mapping Users expect darker = more activity, lighter = less; this is how every heatmap works Low 4-5 discrete color levels (empty, low, medium, high, very high)
Tooltip on hover Every reference product shows exact values on hover; without it users stare at colors guessing Low Show date, hours tracked, entry count
Sensible default time range GitHub shows 1 year; users expect to see something useful without configuration Low Default to trailing 12 months
Day-of-week labels Mon/Wed/Fri labels on the Y-axis for orientation Low Standard in GitHub/GitLab graphs
Month labels Column headers showing month boundaries Low Standard in all calendar heatmaps
Empty state Days with no entries should render as a distinct "no data" color, not be invisible Low Light gray or the theme's muted background color
Click-through to detail Clicking a day should take you somewhere useful Low Navigate to Kimai timesheet view filtered to that date (already in PROJECT.md requirements)
Theme integration Must not look like a foreign element glued onto the dashboard Low Use Kimai CSS variables for colors

Differentiators

Features that elevate the widget beyond a static pretty picture. Not expected by default, but each adds meaningful value for a personal time-tracking use case.

Feature Value Proposition Complexity Notes
Toggle between hours and entry count Different questions: "how much did I work?" vs "how consistently did I track?" -- GitHub only shows one metric Low Button or toggle in widget header; already in PROJECT.md requirements
Project/activity filter Focus on one project at a time to see its cadence Medium Dropdown populated from Kimai data; re-renders heatmap on change
Configurable time range See last 3 months, 6 months, full year, or custom range Medium Range selector in widget header; affects data query and grid size
Streak indicator "Current streak: 12 days" -- gamification that motivates consistency Low Simple calculation: count consecutive non-zero days ending at today
Summary stats row Total hours, average hours/day, busiest day -- quick numbers alongside the visual Low Small text row below or above the heatmap
Weekend vs weekday distinction Subtle visual indicator (border, opacity) for weekends Low Helps distinguish work patterns from weekend work
Responsive widget sizing Widget that adapts if Kimai dashboard column width changes Medium SVG viewBox scaling; cell size calculation based on container width

Anti-Features

Things to deliberately NOT build. Each would add complexity without serving the core "at a glance, see where your time went" purpose.

Anti-Feature Why Avoid What to Do Instead
Real-time updates / live refresh Overengineered for a dashboard widget; page reload is fine for daily granularity data Refresh data on page load only
Billable vs non-billable split Out of scope per PROJECT.md; this is personal tracking, not client billing Single aggregate view
Export/share heatmap as image Out of scope per PROJECT.md; no audience to share with for personal use Users can screenshot if needed
Hour-of-day heatmap (2D matrix) Different visualization entirely; scope creep that doubles the frontend work Stick to the calendar grid; could be a separate widget later
Drill-down charts within the widget Clicking a day to show a pie chart of projects within the widget adds major complexity Click-through to Kimai's existing timesheet/report views instead
Multi-user comparison Personal tracking tool, not a team dashboard Single-user view only
Goal setting / targets Adds state management, settings UI, persistence -- a separate feature domain Streak indicator covers the motivational angle simply
Animated transitions on data change Cool but adds JS complexity for near-zero utility on a dashboard widget Instant re-render on filter change
Mobile-specific layout Out of scope per PROJECT.md; Kimai dashboard is a desktop experience Standard responsive SVG is sufficient
Custom color theme picker Theme integration with Kimai variables is sufficient; custom palettes add a settings UI nobody needs Use Kimai theme variables, pick a single well-tested palette

Feature Dependencies

Calendar grid layout
  --> Color intensity mapping (needs the grid to color)
  --> Tooltip on hover (needs cells to attach to)
  --> Click-through to detail (needs cells to click)
  --> Empty state (needs grid cells for empty days)
  --> Day/Month labels (needs the grid structure)

Toggle hours/count
  --> Requires backend to return BOTH hours and count per day
  --> Re-maps color intensity without re-fetching data

Project/activity filter
  --> Requires backend filter parameter in data API
  --> Dropdown populated via separate Kimai API call (projects list)
  --> Triggers data re-fetch + full heatmap re-render

Configurable time range
  --> Requires backend date range parameter in data API
  --> Affects grid dimensions (fewer weeks = smaller grid)
  --> Triggers data re-fetch + full heatmap re-render

Streak indicator
  --> Depends on the same daily aggregation data as the heatmap
  --> No additional backend work if heatmap data is already loaded

Summary stats
  --> Depends on the same daily aggregation data as the heatmap
  --> Pure frontend calculation from existing data

MVP Recommendation

Phase 1 -- Core heatmap (all table stakes):

  1. Calendar grid with color intensity (the product itself)
  2. Tooltips on hover
  3. Day/month labels and empty state
  4. Click-through to Kimai timesheet view
  5. Kimai theme integration

Phase 2 -- Interactivity (high-value differentiators):

  1. Toggle between hours and entry count
  2. Project/activity filter dropdown
  3. Configurable time range

Phase 3 -- Polish (low-effort differentiators):

  1. Streak indicator
  2. Summary stats row
  3. Weekend distinction

Defer indefinitely:

  • Hour-of-day matrix, export, goals, animations, multi-user -- all anti-features for this context.

Rationale: Phase 1 delivers a complete, useful widget. Phase 2 adds the interactivity that makes it genuinely better than just looking at Kimai's existing reports. Phase 3 is cheap polish that improves daily experience but isn't blocking.

Sources

  • GitHub contribution graph: well-known UX pattern (5 color levels, year grid, tooltips, contribution count)
  • GitLab activity calendar: same pattern, confirms universality
  • WakaTime dashboard: adds analytics layer (coding time heatmap, project breakdowns, streak tracking)
  • RescueTime: productivity scoring approach, hour-of-day patterns
  • Toggl Track insights: report-centric visualizations, project breakdowns
  • cal-heatmap.com: popular open-source JS calendar heatmap library, API design reference
  • All sourced from training data (no live verification available) -- MEDIUM confidence