No description
- Swift 99.5%
- Shell 0.5%
| .claude | ||
| AppIcon.icon | ||
| docs | ||
| plans | ||
| Scripts | ||
| Sources | ||
| .gitignore | ||
| CLAUDE.md | ||
| Info.plist | ||
| project.yml | ||
| README.md | ||
| renovate.json | ||
| TODO.md | ||
TEMPO-UI
A native SwiftUI macOS app (macOS 26, Liquid Glass) for viewing and logging your Tempo time on a week/day calendar.
Features
- Week rail + day timeline — the left rail lists this week's days (Mon–Sat) with per-day worked bars and a today marker; click a day to see its timeline on the right, with worklogs as glass blocks positioned by start time, a "now" line, and an empty-state.
- Log time — click an empty slot (15-min default) or drag a span on the timeline, or use the
Log time button. The Work item field searches Jira live (by key or summary); pick a
result or type a key. Smart time entry:
930→09:30,1430→14:30; Start/End give a computed Duration. Worklog blocks can't overlap. Every new booking shows a 5-second Undo toast that deletes the just-created worklog(s). - Edit / delete — click a worklog block to change its date/time/description, move it to another ticket, or delete it.
- Overtime — the rail card shows a per-month table and the running total, computed from a configurable start date (default Jan 1) → yesterday, plus an optional carry-over balance. Right-click a day in the rail to mark it as an overtime day: it deliberately stays empty and its required hours draw down the balance.
- Personio absences — pick your Personio calendar in Settings and all-day absence events (keyword match, e.g. "Urlaub") are detected in the visible week and auto-booked on a configured vacation issue (or notify-only, via a toggle). A bell in the header collects notifications (bookings, collisions with existing worklogs); the review dialog — reachable from notices, the rail's Vacation/Overtime badges, or right-click — lists every detected day and lets you flip each between vacation worklog and overtime day at any time. Deleting a vacation worklog by hand counts as undo: the day is detected fresh again.
- Google Calendar — connect in Settings to see accepted meetings as striped blocks (with a calendar icon); click one to book a worklog prefilled from the event (Jira key detected from the event text). Hover an event and click the checkmark to book it in one click when exactly one Jira key is detected — otherwise the prefilled Log Time sheet opens. Already-logged events drop off.
- Settings sheet consolidates Jira, Tempo, and Google Calendar. Auto-refresh every 60s, paused while a sheet is open.
See docs/architecture.md for how it works.
Requirements
- macOS 26+ (uses native Liquid Glass)
- Xcode 26+
xcodegen(brew install xcodegen) — the.xcodeprojis generated fromproject.yml, not committed.
Build & run
xcodegen generate # generate TempoUI.xcodeproj from project.yml
open TempoUI.xcodeproj # build & run in Xcode
# …or from the CLI:
xcodebuild -project TempoUI.xcodeproj -scheme TempoUI -configuration Debug build
The Swift Package dependency (GoogleSignIn) resolves automatically on first build.
Setup
Credentials are entered in the in-app Settings sheet (the ⚙︎ button; it opens automatically on
first launch). Full step-by-step instructions are in docs/setup.md:
| For | You provide | Where it's stored |
|---|---|---|
| Tempo (required) | API token + Atlassian Account ID | token in Keychain, account id in UserDefaults |
| Jira (search + log) | site URL + email + Atlassian API token | token in Keychain, rest in UserDefaults |
| Google Calendar (optional) | an OAuth iOS client id (in Info.plist) |
tokens managed by the GoogleSignIn SDK |
Project layout
Sources/
TempoUIApp.swift App entry point (hidden title bar)
Models/ Decodable DTOs (Worklog, ScheduleDay, CalendarEvent, MonthOvertime,
AbsenceNotice)
Services/ TempoClient, JiraClient, CalendarClient, GoogleAuth, KeychainStore
ViewModels/ DashboardViewModel, LogHoursViewModel
Views/ ContentView, DashboardView, RailView, DayTimelineView, LogHoursView,
SettingsView, AbsenceNoticeStack (notification center),
AbsenceReviewView, JiraIssueSearchField
Support/ Theme (palette + glass), DateFormatting, JiraKeyMatcher,
PersonioAbsenceDetector, AbsenceLedger
Info.plist App icon name, Google URL scheme, GIDClientID
AppIcon.icon Icon Composer app icon
project.yml XcodeGen spec
docs/ architecture.md, setup.md