An iOS app to calculate the correct "Ending In" setting for your washer or dryer based on your desired start time and cycle length.
This app helps you determine what time setting to use on your washer or dryer's delay start feature. Simply enter your cycle length and desired start time, and the app calculates the "Ending In" hours setting you need to configure on your appliance.
- Real-time Clock: Automatically displays current time in 24-hour format
- Device Selection: Choose between Washer (3hr base) and Dryer (4hr base)
- Cycle Length Input: Set your specific cycle duration (hours and minutes)
- Desired Start Time: Pick when you want the cycle to start
- Smart Calculation: Automatically calculates the correct "Ending In" setting
- Push Notifications: Receive a reminder when it's time to start your cycle
- iOS 17.0 or later
- Xcode 15.0 or later
- Swift 5.9 or later
- Open
LaundryTimer.xcodeprojin Xcode - Select your development team in the project settings:
- Select the project in the navigator
- Go to "Signing & Capabilities"
- Choose your team from the dropdown
- Connect your iPhone or iPad
- Select your device from the device menu
- Click Run (⌘R)
- Archive the app in Xcode (Product → Archive)
- Upload to App Store Connect
- Add internal testers (you and your wife)
- Install via TestFlight app on your devices
- Build for your device
- Export the IPA file
- Use Apple Configurator or similar tool to install
- Launch the app - Current time displays automatically
- Select Device - Choose "Washer" or "Dryer"
- Set Cycle Length - Tap to open picker and select hours and minutes
- Set Desired Start Time - Choose when you want the cycle to start
- Tap CALCULATE - Get your result
- Set your appliance - Use the displayed "Ending In" hours setting
Current Time: 20:53
Device: Washer
Cycle Length: 2 h 16 m
Desired Start Time: 00:00
Result: Washer — Set to Ending In 6 hours
This means you should set your washer's "Ending In" timer to 6 hours.
- Minimum: 3 hours
- Increment: 1 hour
- Valid values: 3, 4, 5, 6, 7, 8, ...
- Minimum: 4 hours
- Increment: 1 hour
- Valid values: 4, 5, 6, 7, 8, ...
The app performs these calculations:
- Finish Time = Desired Start Time + Cycle Length
- Hours Until Finish = Finish Time - Current Time (adds 24h if negative)
- Ending In = Round up to nearest hour, minimum based on device
The app follows a clean SwiftUI + MVVM architecture:
LaundryTimer/
├── LaundryTimerApp.swift # App entry point
├── ContentView.swift # Main UI
├── Models/
│ ├── DeviceRule.swift # Device configuration
│ └── LaundryConfig.swift # App state model
├── ViewModels/
│ └── LaundryViewModel.swift # Business logic
└── Managers/
└── NotificationManager.swift # Push notifications
The app requests the following permission on first launch:
- Notifications: To send you a reminder when it's time to start your cycle
This app:
- Does NOT collect any data
- Does NOT connect to the internet
- Does NOT share information with third parties
- Stores NO data (everything is in-memory only)
- Requires NO account or login
- Check Settings → LaundryTimer → Notifications
- Ensure notifications are enabled
- Restart the app and grant permission again
If you get signing errors:
- Open project settings
- Change Bundle Identifier to something unique (e.g.,
com.yourname.LaundryTimer) - Select your development team
- Ensure you're using Xcode 15.0+
- Ensure deployment target is iOS 17.0+
- Clean build folder (⌘⇧K) and rebuild
Potential features to add:
- Multiple saved presets for common cycles
- History of past calculations
- Support for different increment patterns
- Dark mode customization
- Widget support
| Current Time | Device | Cycle Length | Desired Start | Expected Output |
|---|---|---|---|---|
| 20:53 | Washer | 2:16 | 00:00 | Set to Ending In 6 hours |
| 20:53 | Dryer | 3:44 | 00:00 | Set to Ending In 7 hours |
| 22:00 | Washer | 2:16 | 00:00 | Set to Ending In 5 hours |
| 22:00 | Dryer | 3:44 | 00:00 | Set to Ending In 6 hours |
Private use only. Not for distribution.
For issues or questions, contact the developer directly.
Built with SwiftUI for iOS 17+