Automate daily timesheets for 200+ engineers. Zero cost. Zero hosting. Zero manual entry.
200 employees spend 15-20 minutes every day on manual timesheet entry. Here's the problem and the fix.
A Python script runs on each developer's machine. No servers. No hosting. No subscriptions.
Script queries your active tickets (IN DEVELOPMENT / CODE REVIEW) via Jira REST API
Splits your 8-hour day equally across tickets with smart descriptions from ticket content
Creates Jira worklogs (Tempo auto-syncs). At month-end, submits timesheet for approval.
Production-ready with 7,268 lines of tested Python code, 528 automated tests, and 22 CLI commands.
Distributes hours equally across active Jira tickets. Runs at your configured time (default 6 PM).
Friday check catches missed days. Backfills using historical ticket data via Jira's "status WAS" queries.
Verifies total hours and submits timesheet for approval. Blocks on shortfalls. Early submission when remaining days are non-working.
Integer division + remainder on last ticket = exact total every time. Generates descriptions from ticket content.
Safe to re-run anytime. Deletes previous entries then creates fresh worklogs. No duplicates, no double-counting.
5 cases covered: daily overhead, no tickets, manual entries, PTO/holidays, PI planning week.
Skips weekends, org holidays (auto-fetched), national holidays (100+ countries), and PTO days. Override system for comp days.
4 core methods read Tempo API first with Jira fallback. Catches manual Tempo entries that Jira can't see.
Submits timesheet mid-month when all remaining days are non-working. No more waiting for the last day.
--view-monthly shows per-day hours with gap detection. --fix-shortfall interactively fills missing days.
Persistent tray icon with color status, one-click sync, PTO dialog, toast notifications, and smart exit check.
Native notifications on Windows (winotify) and Mac (osascript). Welcome greeting, sync status, shortfall alerts.
Personalized "Welcome, {name}!" with time-of-day greeting on launch. "Welcome back" toast when auto-restarted.
Daily scheduler detects if the tray app was closed and relaunches it automatically with a recovery notification.
Adjust your daily sync time from the tray Configure menu. Input dialog validates HH:MM and reschedules instantly.
Verifies today's hours are logged before closing the tray app. Warns if worklogs are missing to prevent gaps.
Full support for Windows 10/11 and macOS. Platform-specific installers, cron jobs, and native UI elements.
Three zip types: Windows Full (embedded Python), Windows Lite, and Mac. One-click install for team members.
API tokens encrypted with Windows DPAPI (tied to user account). HTTPS for all API calls. No cloud storage.
Guided first-run setup: role selection, token entry, location picker (100+ countries), overhead configuration.
Hours distributed across active Jira tickets (IN DEVELOPMENT / CODE REVIEW). Smart descriptions generated from ticket content.
| Tokens needed | Jira + Tempo |
| Time saved/day | 15-20 min |
| Overhead | 2h/day default |
Hours distributed across active Jira tickets in Testing / User Acceptance Testing. Same Jira-based workflow as Developer.
| Tokens needed | Jira + Tempo |
| Time saved/day | 15-20 min |
| Overhead | 2h/day default |
Hours logged via configured manual activities in Tempo. No Jira token needed.
| Tokens needed | Tempo only |
| Time saved/day | 10-15 min |
| Activities | From config |
Pre-configured activities synced via Tempo API. Simplest setup.
| Tokens needed | Tempo only |
| Time saved/day | 10-15 min |
| Activities | From config |
Immediate ROI with zero infrastructure investment.
| Role | Headcount | Time Lost/Month | Annual Cost |
|---|---|---|---|
| Developers | 150 | 825 hrs | $693,000 |
| Product Owners | 30 | 220 hrs | $211,200 |
| Sales Team | 20 | 147 hrs | $114,660 |
| Manager Follow-ups | 15 | 130 hrs | $140,400 |
| Total | 215 | 1,322 hrs | $1,159,260 |
Reduction in manager follow-up time
On-time submission rate (was 62%)
Infrastructure and hosting cost
Total 5-year investment
Rapid iteration from February 3 to February 23, 2026. 10 releases in 3 weeks.
Daily sync, Jira/Tempo integration, smart descriptions, idempotent overwrite
ASCII-only output, DualWriter, batch wrappers, active daily use
Holidays (100+ countries), PTO, weekly verify, monthly submit, 12 new CLI commands
Tray icon, animated sync, toast notifications, smart exit, auto-start
install.bat rewrite, welcome toast, --stop flag, auto-register
5 overhead cases, PI support, hybrid Jira+Tempo detection
Full macOS: tray app, install.sh, cron jobs, osascript toasts/dialogs
Gap detection, --view-monthly, --fix-shortfall, dynamic tray menu items
build_dist.bat, 3 zip types, embedded Python 3.12, install.bat auto-detect
Submit mid-month when remaining days are non-working. 385 tests passing.
Data safety (create-before-delete with rollback), pre-sync health check, retry logic (429/502/503/504), config validation, --dry-run, --backfill, --approval-status, --log-format json, weighted distribution, holiday cache with TTL, parallel worklog creation, 500 tests (71% coverage), CI/CD (GitHub Actions), ruff+pre-commit, keyring credentials (Mac/Linux)
Auto-sync fires at configured time with accurate toast (hours logged / reason). Task Scheduler double-sync fix. QA role (Testing / UAT statuses). --dry-run works with --submit.
Correct submit endpoint, reviewer lookup, approval status flow, and response body error logging. 528 tests passing.
Real output from the running application.
Run python tempo_automation.py or python tempo_automation.py --date 2026-02-20
Run python tempo_automation.py --show-schedule
Run python tempo_automation.py --view-monthly
Right-click the tray icon to access all features. The app lives in your system tray and runs silently in the background.
The app icon sits in your system tray alongside other apps. Color indicates status.
Add PTO dates, select overhead stories, or change your daily sync time.
View daily log, schedule calendar, or monthly hours report directly from the tray.
Tray icon colors: Green = idle, Orange = pending/syncing, Red = error
Full command reference: python tempo_automation.py [option]
Choose your platform. Download. Install. Done.
Get the appropriate zip: Windows Full (includes Python), Windows Lite, or Mac
Run install.bat (Windows) or ./install.sh (Mac). Follow the setup wizard.
Tray app starts automatically. Timesheets are filled every day at 6 PM.
Full documentation: SETUP_GUIDE.md
8 classes, single file, no external frameworks. Easy to maintain and extend.
Developers and QA write to Jira; Tempo auto-syncs. PO/Sales write directly to Tempo.
| Class | Lines | Purpose |
|---|---|---|
| DualWriter | 48 | stdout + file dual output (--logfile) |
| CredentialManager | 105 | DPAPI encrypt/decrypt for Windows |
| ConfigManager | 266 | Config, setup wizard, location picker |
| ScheduleManager | 639 | Holidays, PTO, overrides, calendar |
| JiraClient | 367 | Worklogs CRUD, active issues, JQL, ADF |
| TempoClient | 157 | Worklogs, submit timesheet, periods |
| NotificationManager | 247 | SMTP email, Teams webhook, desktop toast |
| TempoAutomation | 2,574 | Orchestration, sync, verify, backfill, overhead, approval status |
| Total | 5,411 | + CLI (308 lines, 22 arguments) |
Shipped in v4.0 and planned enhancements.