Skip to content
Daniyar Kurmanbayev
Portfolio banner

End of Day

Minimal SwiftUI journaling app built from Figma to App Store with StoreKit 2 unlock.

End of Day banner

Case study

Quick facts

  • Role: Solo iOS developer, StoreKit/release support, QA and fix owner
  • Timeframe: January-February 2026
  • Platform: iOS 17+
  • Status: Public App Store app
  • Team: Solo implementation from client-provided Figma and QA notes

Context

End of Day is a small journaling app built around a quiet nightly writing ritual. The client wanted the app implemented from Figma without scope creep: no accounts, no backend, no cloud sync, no long-term journal history, and no heavy dependencies.

The goal was a calm, precise v1 with a local-only privacy model, a short free trial experience, and a one-time StoreKit 2 unlock.

What I built

  • Onboarding, daily writing flow, settings, legal/about links, feedback, and review actions.
  • Daily prompt-pair logic with a product-specific 4:00 AM day boundary.
  • First-three-days free behavior and premium prompt rotation.
  • StoreKit 2 non-consumable purchase and restore flow.
  • Local persistence for onboarding, prompt history, premium cache, current-day state, rating state, and app behavior.
  • Lottie onboarding animation integration through Swift Package Manager.
  • TestFlight-ready builds, App Store support, privacy manifest updates, and final handoff.

Architecture

The app uses a compact SwiftUI architecture with a composition root, custom router, feature view models, reusable design components, StoreKit service, and local persistence. MVVM was chosen over heavier Clean Architecture because the product was intentionally small and closed in scope.

Outcome

The full v1 scope shipped to the App Store across three approved milestones. After release, I diagnosed and fixed a production monetization issue where the day-4 paywall did not appear after a pre-launch optimization.

The client approved portfolio use and proposed a second similar journaling app using End of Day as the base.

Technical notes

The most product-specific detail was the custom day boundary. A journaling session after midnight should still feel like the user’s previous evening, so prompt state is anchored around a 4:00 AM rollover instead of the calendar day.