Why Another Calendar App?
The default iOS Calendar app is functional but uninspired. Third-party alternatives pack in features but often feel bloated or non-native. There's a gap in the market for a calendar app that feels like it belongs on iOS — one that uses native frameworks, respects platform conventions, and adds genuine value through thoughtful interaction design rather than feature accumulation.
Calenduh fills that gap. It's a calendar app that feels like Apple would have built it if they had more time.
Going Native: Swift All The Way
The decision to build natively in Swift — rather than using React Native, Flutter, or another cross-platform framework — was deliberate and non-negotiable for this project.
Why Native Matters for a Calendar
-
Haptic feedback — Calendar interactions deserve tactile responses. When you drop an event into a new time slot, you should feel it. UIKit's haptic engine integration gives us precise control over impact, selection, and notification feedback patterns.
-
120fps animations — On ProMotion displays, the difference between 60fps and 120fps is immediately noticeable in scroll and gesture animations. Native Swift with Core Animation renders at the display's native refresh rate without frame drops.
-
Widget support — WidgetKit requires native Swift. Home screen widgets showing today's schedule at a glance are essential for a calendar app.
-
System integration — Deep EventKit integration means Calenduh works with every calendar source the user already has configured. No account creation required, no data migration, no sync conflicts.
Architecture
Calenduh uses the MVVM (Model-View-ViewModel) pattern with Swift's @Observable macro for reactive state management:
- Models — thin wrappers around
EKEventandEKCalendarwith computed properties for display logic - ViewModels — manage state, handle EventKit queries, and coordinate between views
- Views — SwiftUI views composed from reusable components with UIKit hosting for custom gesture handling
The calendar grid itself is a custom UICollectionView with compositional layout, enabling the fluid zoom transitions between day, week, and month views. Each zoom level is a different section layout, and the transition animates between them using UIViewPropertyAnimator with spring timing.
The Gesture System
Calenduh's gesture system is its defining feature. Every interaction should feel physical — events have weight, time slots have magnetism, and transitions have momentum.
Custom Gesture Recognizers
We built three custom UIGestureRecognizer subclasses:
- CalendarPinchRecognizer — handles zoom between day/week/month with velocity tracking for momentum-based transitions
- EventDragRecognizer — manages long-press-to-drag for rescheduling events, with snapping to 15-minute intervals and haptic feedback at snap points
- TimeSlotTapRecognizer — converts tap locations to precise time values based on the current zoom level and scroll position
Each recognizer uses velocity and acceleration data to create physics-based animations. When you flick an event to a new day, it decelerates naturally. When you pinch to zoom, the transition continues with momentum after you lift your fingers.
Privacy by Default
Calenduh processes everything on-device. Calendar data stays in EventKit — we don't run a backend, we don't sync to our servers, and we don't have access to your schedule. This isn't just a privacy feature; it's an architectural simplification that eliminates an entire class of security concerns and infrastructure costs.
The only network calls Calenduh makes are for CloudKit sync (Apple's infrastructure, end-to-end encrypted) and optional weather data for outdoor event suggestions.
Lessons in Native Development
Building Calenduh reinforced our belief that native development still matters. Cross-platform frameworks have their place, but for apps where interaction quality is the product — where the feel of a gesture or the smoothness of an animation determines whether users stick around — native Swift remains the gold standard.