EspaΓ±ol | English
An iOS app to save and celebrate your personal achievements as digital sticky notes.
π dianait.blog/kudos
- Save achievements: Create sticky notes with your achievements and personal victories
- Visual counter: See how many achievements you've saved in your collection
- Celebration animations: Animated confetti when you save a new achievement
- Achievement carousel: Navigate through all your saved achievements with a swipe gesture
- Delete from carousel: Remove achievements directly from the carousel without entering detail view
- Photo support: Attach a photo to any achievement
- Multi-language: Spanish and English with real-time switching
- Complete privacy: All data is stored locally on your device, nothing leaves your phone
- Accessibility: Full VoiceOver support with localized labels and hints
- Add an achievement: Tap the sticky note on the main screen, write your achievement, swipe up to save
- View your achievements: Tap the counter at the top to open the carousel, swipe to navigate
- Delete an achievement: Tap the trash icon on the active note in the carousel
- Change language: Settings tab β select your preferred language
Kudos is built with Clean Architecture and MVVM, keeping the dependency rule strictly: Domain has no external dependencies.
kudos/
βββ Domain/
β βββ Models/ # AccomplishmentItem, NewAccomplishment
β βββ Protocols/ # Use case + repository contracts
β βββ UseCases/ # AddAccomplishment, AddPhotoAccomplishment (business logic only β pure pass-throughs removed)
β βββ Utilities/Validators # AccomplishmentValidator, ValidationError
βββ Data/
β βββ Entities/ # AccomplishmentEntity (@Model, SwiftData)
β βββ Repositories/ # AccomplishmentRepository (SwiftData impl)
βββ Presentation/
β βββ Main/ # MainView + MainViewModel
β βββ Carousel/ # CarouselView, AccomplishmentDetailView
β βββ Stickies/ # StickyView and subcomponents
β βββ Settings/ # SettingsView
β βββ AboutMe/ # AboutView
β βββ Error/ # ErrorView
β βββ Utilities/
β βββ Constants/ # Dimensions, Space, Timing, Icon, etc.
β βββ Localization/ # Copies, A11y, LanguageManager
β βββ Confetti/ # Celebration animation components
βββ Dependencies/
β βββ AppFactory.swift # Dependency injection
βββ Services/
βββ AppSettings.swift
βββ LocalizationManager.swift
| Language | Swift 6 |
| UI | SwiftUI |
| Persistence | SwiftData |
| Min iOS | 17.0 |
| Xcode | 15.0+ |
| Concurrency | Swift 6, strict concurrency complete |
- Clean Architecture: Domain β Data β Presentation, dependency rule enforced
- MVVM:
MainViewModelmanages presentation state - Protocol-based DI: Use cases and repository injected via protocols; ViewModel calls repository directly for simple fetch/delete (no use case when there's no business logic)
- Validation layer:
AccomplishmentValidatorin Domain, not in views - Localization:
CopiesandA11yenums with.localizedextension, real-time language switching - Swift 6 concurrency: all types fully isolated (
@MainActoron ViewModels, use cases, and repository); image compression offloaded to background thread
All data lives on your device. No analytics, no external servers, no tracking.
# Unit + UI tests
xcodebuild test -project kudos.xcodeproj -scheme kudosTests -destination 'platform=iOS Simulator,name=iPhone 15'
xcodebuild test -project kudos.xcodeproj -scheme kudosUITests -destination 'platform=iOS Simulator,name=iPhone 15'Developed with β€οΈ by @Dianait