Off Clock iOS · SwiftUI · WidgetKit
Personal iOS project

Know exactly
when you're off.

A dynamic clock-out calculator for people whose shifts don't run on fixed alarms.

Off Clock solves one problem: if your clock-in time moves every day, a fixed 5:00 alarm is useless. It continuously recomputes your clock-out time from the moment you clock in, your target hours, and a payroll rule that only forgives the first 30 minutes of break — every minute past that pushes your clock-out back one-for-one.

  • Live Activities & Dynamic IslandReal-time break and clock-out status on the lock screen, no unlock required.
  • Survives a force-quitEvery timer is recomputed from stored timestamps, never a running clock — killing the app can't desync it.
  • Haptic + notification alarmsCoreHaptics-driven alerts when a break or your target hours expire, with per-alarm mute controls.
Swift 5.9 @Observable ActivityKit WidgetKit CoreHaptics UserNotifications scenePhase persistence
9:41
Off Clock
your time, tracked precisely
Target work hours
8h
Minimum break deduction
30 min
Break alarm
Clock-out alarm

Working

Since 9:02 AM
Off Clock At
5:32 PM
Time Worked
3:14
4h46mleft
15m 28s of free break remaining

Today's Timeline

Clocked In
9:02 AM
Fixed Break
12:00 PM · 14m 32s
Checklist
Alerts
Settings
On Break
Fixed · 15m
8:42remaining
23m 42s of free break remaining
On Break
Open · running
29:50
New Est. Clock-Out
5:32 PM
10s of free break remaining
Day Complete
Worked 8:02
Dynamic Island reflects whichever state is selected above — try switching to a break tab.
The one formula the whole app is built around
Off Clock At = Clock In + Target Hours + max(30 min, Total Break Taken)

The first 30 minutes of break are free — standard for a lot of hourly payroll systems. Every minute beyond that pushes the clock-out time back one-for-one, live. The Open Break screen recalculates this every second, so the moment you cross the 30-minute mark, the estimated clock-out visibly starts climbing.

Lock screen & Dynamic Island

An ActivityKit Live Activity keeps the running timer and clock-out estimate visible without unlocking the phone — compact pill, expanded view, and lock screen widget all driven from one shared timeline.

Timestamp-based timers

No timer ever stores an accumulating delta. Every displayed duration is recomputed from stored Date values on each foreground/tick, so a force-quit or hours in the background can't drift the numbers.

Editable timeline

Forgot to log a break? Every entry in the day's timeline — clock-in, breaks, clock-out — is retroactively editable inline, with overlap and ordering guards so edits can't corrupt the running calculation.