The habit tracker that respects you.
Free. No ads. No limits. No accounts. Open source.
- Open Xcode 15+
- File → New → Project → iOS App
- Product Name:
SteadyFlow - Bundle Identifier:
com.steadyflow.habits - Interface: SwiftUI
- Storage: SwiftData
- Check: Include Widget Extension
- Minimum Deployment: iOS 17.0
- Delete the auto-generated files (ContentView.swift, Item.swift, etc.)
- Drag the
SteadyFlow/folder into the project navigator - Drag the
SteadyFlowWidget/folder into the widget extension target - Build & Run
git clone https://github.com/Temaki-AI/steady.git
cd steady
# Then follow Option 1 steps 2-12 above- App Group: Add
group.com.steadyflow.habitsto both app and widget targets - CloudKit: Enable iCloud capability → check CloudKit → container:
iCloud.com.steadyflow.habits - Push Notifications: Enable for background refresh (notifications)
- Background Modes: Enable Background Fetch
SteadyFlow/
├── SteadyFlowApp.swift # App entry + SwiftData container
├── Models/
│ ├── Habit.swift # Core habit model
│ ├── Completion.swift # Date-based completions
│ ├── DailyNote.swift # One note per day
│ └── HabitSchedule.swift # Flexible scheduling enum
├── Views/
│ ├── Today/ # Main tab
│ ├── Progress/ # Stats + heatmap
│ ├── Settings/ # Export, appearance, archive
│ ├── Shared/ # Create/edit forms
│ ├── Components/ # Reusable UI (CheckCircle, StreakBadge)
│ └── DesignSystem.swift # Design tokens
├── Services/
│ ├── HabitService.swift # Business logic
│ ├── StreakCalculator.swift # Streak computation
│ ├── HeatmapDataProvider.swift # Contribution graph data
│ ├── NotificationManager.swift # Smart notification scheduling
│ └── ExportService.swift # JSON/CSV export
SteadyFlowWidget/
└── SteadyFlowWidget.swift # Home screen widgets
- SwiftUI + SwiftData + CloudKit
- iOS 17+ (for interactive widgets, @Observable)
- Zero external dependencies
- Zero analytics / telemetry
GPLv3