Skip to content

Rowerguy508/DuoWall

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 

Repository files navigation

DuoWall - Couples Life Hub

A SwiftUI iOS app designed for exactly two people (you + your partner) to share and coordinate life together. Think of it as FamilyWall, but optimized for couples.

Features

Core Features

  • Couple Space: Create a private shared space with CKShare invite system
  • Meals: Weekly meal planning with recipes, ingredients, and nutrition tracking
  • Tasks: Shared task list with recurring chores and assignees
  • Budget: Savings goals tracking with contributions and expenses
  • Map: Opt-in location sharing with privacy controls

Key Capabilities

  • CloudKit Sync: All data syncs between partners via iCloud
  • Public/Private Visibility: Control what your partner can see
  • Diet Restriction Warnings: Automatic alerts when meals contain restricted ingredients
  • Grocery List Generator: Auto-generate shopping lists from planned meals
  • Recurring Tasks: Daily, weekly, monthly, or custom recurrence
  • Battery-Friendly Location: Significant location change updates only

Requirements

  • iOS 17.0+
  • Xcode 15.0+
  • Apple Developer Account (for CloudKit)
  • Two iCloud accounts (for testing sharing)

Project Structure

DuoWall/
├── DuoWall.xcodeproj/
├── DuoWall/
│   ├── DuoWallApp.swift          # App entry point
│   ├── ContentView.swift          # Root view + tab navigation
│   ├── Info.plist                 # App configuration
│   ├── DuoWall.entitlements       # iCloud entitlements
│   │
│   ├── Models/
│   │   ├── Models.swift           # Enums and basic types
│   │   └── DataModels.swift       # SwiftData @Model classes
│   │
│   ├── ViewModels/
│   │   ├── CoupleSpaceViewModel.swift
│   │   ├── MealsViewModel.swift
│   │   ├── TasksViewModel.swift
│   │   ├── BudgetViewModel.swift
│   │   └── MapViewModel.swift
│   │
│   ├── Views/
│   │   ├── Onboarding/
│   │   ├── Home/
│   │   ├── Meals/
│   │   ├── Tasks/
│   │   ├── Budget/
│   │   ├── Map/
│   │   └── Settings/
│   │
│   ├── Services/
│   │   ├── CloudKitManager.swift  # CloudKit sync operations
│   │   └── LocationManager.swift  # Location services
│   │
│   └── Utilities/
│       └── Helpers.swift          # Date extensions, helpers
│
└── README.md

Setup Instructions

1. Configure Your Apple Developer Account

  1. Log in to Apple Developer Portal
  2. Create a new App ID with:
    • Bundle ID: com.yourteam.DuoWall (or your own)
    • Enable iCloud capability
    • Enable CloudKit under iCloud
    • Enable Push Notifications (for sync notifications)

2. Create CloudKit Container

  1. Go to CloudKit Dashboard
  2. Create a new container: iCloud.com.yourteam.DuoWall
  3. In Schema, create these Record Types:

CoupleSpace

Field Type
id String
createdAt Date/Time
ownerUserRecordName String
partnerUserRecordName String
isConnected Int64

MealEntry

Field Type
id String
date Date/Time
mealType String
title String
notes String
servings Int64
calories Int64
protein Int64
carbs Int64
fat Int64
tags String (List)
ingredients String (List)
steps String (List)
store String
visibility String
ownerUserRecordName String
coupleSpaceID String
createdAt Date/Time
updatedAt Date/Time

TaskItem

Field Type
id String
title String
notes String
dueDate Date/Time
isComplete Int64
recurrenceRule String
customRecurrenceDays Int64
assignee String
visibility String
ownerUserRecordName String
coupleSpaceID String
createdAt Date/Time
updatedAt Date/Time

GroceryItem

Field Type
id String
name String
quantity String
category String
store String
isChecked Int64
visibility String
ownerUserRecordName String
coupleSpaceID String
updatedAt Date/Time

BudgetGoal

Field Type
id String
title String
notes String
targetAmount Double
targetDate Date/Time
visibility String
ownerUserRecordName String
coupleSpaceID String
createdAt Date/Time
updatedAt Date/Time

BudgetTransaction

Field Type
id String
goalID String
transactionType String
amount Double
date Date/Time
note String
category String
visibility String
ownerUserRecordName String
coupleSpaceID String

LocationStatus

Field Type
userRecordName String
isSharingEnabled Int64
accuracyMode String
expiry String
expiresAt Date/Time
lastLatitude Double
lastLongitude Double
lastUpdatedAt Date/Time
coupleSpaceID String
  1. Add indexes for queryable fields:

    • coupleSpaceID (Queryable) on all record types
    • ownerUserRecordName (Queryable) on all record types
    • date (Queryable, Sortable) on MealEntry
    • dueDate (Queryable, Sortable) on TaskItem
  2. Deploy schema to Production when ready

3. Configure Xcode Project

  1. Open DuoWall.xcodeproj in Xcode
  2. Select the project in the navigator
  3. Go to Signing & Capabilities
  4. Select your Team
  5. Update Bundle Identifier if needed
  6. Ensure these capabilities are enabled:
    • iCloud (CloudKit checked, container selected)
    • Push Notifications
    • Background Modes (if adding background location)

4. Update Container Identifier

In CloudKitManager.swift, update the container identifier:

self.container = CKContainer(identifier: "iCloud.com.yourteam.DuoWall")

Also update in DuoWallApp.swift for share handling.

5. Build and Run

  1. Connect an iOS device or use Simulator
  2. Build and run (Cmd+R)
  3. Sign in to iCloud on the device if not already

Testing CKShare Between Two Users

Setup

  1. You need TWO physical iOS devices (or one device + simulator)
  2. Each device must be signed into a DIFFERENT iCloud account
  3. Both accounts must have iCloud Drive enabled

Test Flow

On Device A (Owner):

  1. Launch app
  2. Complete onboarding
  3. Create Couple Space
  4. Tap "Invite Partner"
  5. Share the link via Messages/AirDrop/etc.

On Device B (Partner):

  1. Receive the share link
  2. Tap the link - it should open DuoWall
  3. Accept the share invitation
  4. You should now see the shared space

Verify Sync

  1. Add a task on Device A
  2. Check Device B - task should appear within seconds
  3. Complete task on Device B
  4. Verify on Device A

TestFlight Distribution

1. Archive

  1. In Xcode, select Product > Archive
  2. Wait for archive to complete
  3. Organizer window will open

2. Upload to App Store Connect

  1. In Organizer, select your archive
  2. Click Distribute App
  3. Select App Store Connect
  4. Select Upload
  5. Follow prompts (Manage signing automatically recommended)

3. Configure in App Store Connect

  1. Go to App Store Connect
  2. Select your app
  3. Go to TestFlight tab
  4. Wait for build processing (5-30 minutes)
  5. Add Test Information (what to test, email, etc.)
  6. Set up Internal or External testing group
  7. Add testers by email

4. Invite Testers

For Internal Testing:

  • Add Apple ID email addresses
  • Testers get instant access

For External Testing:

  • Requires Beta App Review (usually 24-48 hours)
  • Can use public link for up to 10,000 testers

Debugging Tips

CloudKit Issues

  • Check CloudKit Dashboard for records
  • Verify container identifier matches
  • Ensure schema is deployed to appropriate environment
  • Check device is signed into iCloud

Share Not Working

  • Both users must have iCloud enabled
  • Check that CKShare was created successfully
  • Verify the URL scheme is correctly registered

Location Issues

  • Check Info.plist has location usage descriptions
  • Verify location permission was granted
  • Test on real device (simulator location is simulated)

Debug Menu

In DEBUG builds, go to Settings > Debug Menu to:

  • Add sample data
  • View app state
  • Clear local data

Architecture Notes

  • SwiftUI + MVVM: Views are declarative, business logic in ViewModels
  • SwiftData: Local persistence with offline support
  • CloudKit: Sync via CKRecord operations (not automatic SwiftData sync)
  • CKShare: Partner invitation via iOS sharing sheet
  • Async/Await: All CloudKit operations use modern concurrency

Known Limitations

  • Partner profile sync requires both users to be online
  • Location sharing requires foreground or recent background activity
  • CKShare acceptance requires the app to be installed first
  • Conflict resolution is last-write-wins

Future Enhancements

  • Resy/OpenTable integration for Date Night
  • Push notifications for task reminders
  • Calendar integration
  • Photo sharing
  • Chat/notes feature
  • Widget support

License

Private project - not for distribution.


Built with SwiftUI, CloudKit, and SwiftData for iOS 17+.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages