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):
- Calendar grid with color intensity (the product itself)
- Tooltips on hover
- Day/month labels and empty state
- Click-through to Kimai timesheet view
- Kimai theme integration
Phase 2 -- Interactivity (high-value differentiators):
- Toggle between hours and entry count
- Project/activity filter dropdown
- Configurable time range
Phase 3 -- Polish (low-effort differentiators):
- Streak indicator
- Summary stats row
- 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