하루 한 장의 사진으로 오늘을 기록하고, 미션과 스트릭으로 다시 돌아오게 만드는 iOS 습관 앱입니다.
DailyFrame은 공개 피드나 실시간 인증보다 개인 기록, 로컬 저장, 빠른 기록 루프에 집중합니다. 사용자는 매일 한 장의 사진과 짧은 메모를 남기고, 앱은 미션, 스트릭, 캘린더 아카이브로 기록을 이어갈 이유를 제공합니다.
| Today | Capture | Complete | Calendar |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
- Habit loop: 오늘의 미션, 기록 완료 보상, 스트릭 상태를 한 화면에서 확인합니다.
- Photo-first archive: 기록한 날은 캘린더에서 사진 썸네일로 보이며 상세 기록으로 이어집니다.
- Local-first persistence: 개인 기록 앱의 성격에 맞게 로컬 저장소 중심으로 설계했습니다.
- Media handling: 원본 이미지와 썸네일을 분리 저장하고, 앱 시작 시 미디어 정리를 수행합니다.
- Notification settings: 매일 기록 알림과 시간 설정을 프로필 화면에서 관리합니다.
- Localization: 한국어, 영어, 일본어 문자열 리소스를 분리해 다국어 확장을 고려했습니다.
| Area | Implementation |
|---|---|
| Platform | iOS 18.5+ |
| Language | Swift 5 |
| UI | SwiftUI, SF Symbols, custom design tokens |
| Architecture | MVVM + service/repository layer |
| Persistence | Local JSON/file storage |
| Media | PhotosPicker, camera capture, thumbnail storage |
| Tests | XCTest unit tests for streak behavior |
DailyFrame/
├── App/ # RootView, tab composition
├── DesignSystem/ # Color, spacing, card primitives
├── Features/ # Home, Calendar, EntryEditor, EntryDetail, Profile, Onboarding
├── Models/ # Entry, mission, streak, settings, profile models
├── Services/ # Mission, streak, notification, media, persistence services
├── Utilities/ # Date formatting and localization helpers
└── *.lproj/ # KO / EN / JA localized resources
The code separates user-facing screens from app rules. View models orchestrate repositories and services, while persistence and media responsibilities remain behind focused service types.
- Onboarding introduces the one-photo habit concept.
- Home shows the current streak, today's mission, today's entry, monthly progress, and recent records.
- Entry editor supports photo library import, camera capture, memo, mood, and save validation.
- Completion confirms the reward state and next streak goal.
- Calendar visualizes saved days as image thumbnails.
- Archive/Profile summarizes record counts, best streak, current streak, and reminder settings.
- Streak recalculation is covered by unit tests in
DailyFrameTests/StreakServiceTests.swift. - Repeatable feature-complete smoke coverage is defined in
docs/qa-smoke-checklist.md. - UI copy is localized through
Localizable.stringsinstead of hard-coded in feature views. - Personal media is stored locally by default; optional private iCloud sync can be enabled from Profile, while public feed, account system, and non-iCloud backend sync remain out of MVP scope.
- App Store style screenshots are kept in
AppStoreScreenshots/so reviewers can understand the product without opening Xcode.
- Open
DailyFrame/DailyFrame.xcodeprojin Xcode. - Select the
DailyFramescheme. - Run on an iOS 18.5+ simulator or device.
CLI verification:
xcodebuild test \
-project DailyFrame/DailyFrame.xcodeproj \
-scheme DailyFrame \
-destination 'platform=iOS Simulator,name=iPhone 16'- Add richer entry search/filtering in the archive.
- Add lightweight weekly review insights.
- Expand widget and reminder surfaces.
- Add opt-in private iCloud sync after the local-first MVP is stable.
- Commit messages use
type(scope): Korean summary. - Keep one intent per commit.
- Do not commit Xcode user state or build artifacts.
- Verify relevant build/tests before merging.



