- Replace 5-tab layout with 4 tabs: Dashboard, Timer, Entries, Settings - Dashboard: add Work Time Balance section using /client-targets API, showing per-client weekly progress bar, overtime/undertime label and expandable week breakdown - Time Entries: replace flat list with UICalendarView month grid; tap a day to see that day's entries; add filter sheet (date range, project, client); new TimeEntryDetailSheet for creating and editing entries; duration shown as Xh Ymin - Settings tab: user info header, navigation to Clients and Projects, logout button - ClientsListView: list with NavigationLink to ClientDetailView - ClientDetailView: inline client editing + full work time target CRUD (create, edit, delete target; add/delete balance corrections with date, hours, description) - ProjectsListView: grouped by client, NavigationLink to ProjectDetailView - ProjectDetailView: edit name, description, colour, client assignment - Add ClientTarget, WeekBalance, BalanceCorrection models and APIEndpoints for /client-targets routes - Update TimeInterval formatter: add formattedShortDuration (Xh Ymin / Xmin / <1min) used throughout app; keep formattedDuration for live timer display
TimeTracker iOS App
Setup Instructions
Prerequisites
-
XcodeGen - Required to generate the Xcode project
# On macOS: brew install xcodegen # Or via npm: npm install -g xcodegen -
Xcode - For building the iOS app (macOS only)
Project Generation
After installing XcodeGen, generate the project:
cd ios/TimeTracker
xcodegen generate
This will create TimeTracker.xcodeproj in the ios/TimeTracker directory.
Configuration
Before building, configure the API base URL:
- Open
TimeTracker.xcodeprojin Xcode - Select the TimeTracker target
- Go to Info.plist
- Add or modify
API_BASE_URLwith your backend URL:- For development:
http://localhost:3001 - For production: Your actual API URL
- For development:
Building
Open the project in Xcode and build:
open ios/TimeTracker/TimeTracker.xcodeproj
Then select your target device/simulator and press Cmd+B to build.
Authentication Setup
- Configure your OIDC provider settings in the backend
- The iOS app uses ASWebAuthenticationSession for OAuth
- The callback URL scheme is
timetracker://oauth/callback
App Groups
For the widget to work with the main app, configure the App Group:
- Identifier:
group.com.timetracker.app - This is already configured in the project.yml
Dependencies
The project uses Swift Package Manager for dependencies:
- SQLite.swift - Local database
- KeychainAccess - Secure storage
Project Structure
TimeTracker/
├── TimeTrackerApp/ # App entry point
├── Core/
│ ├── Network/ # API client
│ ├── Auth/ # Authentication
│ └── Persistence/ # SQLite + sync
├── Features/
│ ├── Auth/ # Login
│ ├── Timer/ # Timer (core feature)
│ ├── TimeEntries/ # Time entries CRUD
│ ├── Projects/ # Projects CRUD
│ ├── Clients/ # Clients CRUD
│ └── Dashboard/ # Dashboard
├── Models/ # Data models
├── Shared/ # Extensions & components
└── Resources/ # Assets
TimeTrackerWidget/ # iOS Widget Extension