Help & Support

Chain of Habits

Last updated: September 24, 2026

Quick Start

  1. Tap Add Habit to create your first habit.
  2. Choose Every day, Weekdays, Weekends, one exact weekday, or a custom set such as Tuesday and Thursday, then set reminder times.
  3. Tap a binary habit to mark it complete, or tap a daily counter to log one unit. After counter progress begins, use the visible minus button to remove one.
  4. Use the date picker to backfill previous days when needed.

Core Features

Cloud Sync (CloudKit)

Chain Of Habits saves your data locally first. The production app enables automatic background CloudKit sync by default. When you are signed in to iCloud and CloudKit is available, supported habit, goal, settings, and completion state can sync through your private iCloud database. The app remains usable if iCloud is unavailable or the device is offline. In version 2.3, local reminder scheduling runs independently of cloud waits, including later edits and completion changes while the same sync is still waiting.

Development and UI-test builds can explicitly disable CloudKit. Open Settings → Support → View Cloud Sync Debug Info to review provider account and sync information when available. Settings → Notification Diagnostics shows the app’s current sync stage and elapsed time separately from local reminder status, even while provider information is waiting. CSV export and import remain a user-controlled backup and restore path whether CloudKit is available or not.

If the app cannot sync, check:

Export, Restore, and Reset

Export creates one UTF-8 CSV containing a habits table, one physically blank separator record, and a completions table. Import accepts that combined file, or exactly two files selected together containing one habits table and one completions table. The app identifies tables by exact headers, not filenames.

Included habit data covers identity and text, active/notification state, schedules and every-N anchors, primary/secondary/weekend reminders, sort order, icon/color, and daily counter target/unit/rule. Included completion data covers habit ID, ISO-8601 time, source, and unit count. Goals/links; Settings/appearance; experiments/reports; insight snoozes, dismissals, and feedback recency; milestone seen/queue/share presentation state; notification authorization; CloudKit and notification diagnostics; and other device-local records are not part of the CSV. Pending notifications and completion sync work are derived after import rather than restored from the file.

Before any write, the review shows selected-file classification, active/inactive and completion totals, adds/updates, legacy warnings, merge-only behavior, and exclusions. Confirmation adds or updates imported identities in one atomic local save. It never deletes data merely because it was omitted. Completion changes stay pending locally and are attempted later only when CloudKit sync is enabled and available; the local result never claims that a cloud upload completed. The aggregate limit is 5 MiB and 100,000 CSV records.

Clear All Data removes visible habits, goals, completion history, and resets settings. Inactive habit deletion tombstones and completion sync bookkeeping may remain locally to prevent deleted cloud data from returning; this action is not an immediate physical purge of every row.

Troubleshooting

App launches but no habits appear

Create a habit first using Add Habit. The list is empty until at least one habit exists.

Unexpected friction alert for a new habit

New habits are evaluated from first completion onward. If behavior looks incorrect, update to latest build.

Notifications not firing

  1. Check the app’s notification toggle and the habit’s reminder times in Add/Edit Habit. Confirm the habit is active, due, and still incomplete for the reminder day.
  2. Open Settings → Notification Diagnostics and choose Refresh. Check authorization, alert/sound settings, pending requests, local reminder status, and the normal automatic alert history.
  3. Use Open iOS Notification Settings to review system permissions. Presentation and paired Apple Watch routing also depend on system settings; the diagnostic report cannot inspect every Focus or Watch setting.
  4. Review a normal reminder’s planned time and scheduling outcome. An OS-accepted request means iOS accepted scheduling, not that a banner, sound, or Watch alert appeared. A retained delivered entry is an observation; a missing entry does not prove either success or failure.
  5. If you need help, use Copy or Share in Notification Diagnostics and send the report to the support address below. Include approximately when you expected an alert and what you observed. Review any additional text or screenshots before sending.

Normal operations are logged automatically; you do not need to press a test button to collect this history. The on-device log keeps up to 40 operation events, a separately retained latest failure, and up to 120 distinct normal alert records with planned times. Repeated rebuilds are coalesced, and older entries are removed as the bounded history fills. Refresh only reads settings and queues and records observations; it does not request permission or reschedule reminders.

The optional ten-second test is separate from your habit reminders. It requires existing iOS authorization, uses default sound and Time Sensitive priority, and protects existing reminder capacity. Its result reports scheduling acceptance, not presentation. Secondary reminders follow configured primary reminders and stay within the same local day; completing a habit before its reminder time suppresses pending same-day reminders.

Diagnostic reports omit habit names, notification content, raw request identifiers, and local correlation hashes. They include app/build and OS information, time zone, aggregate configuration, planned times, safe error codes, and scheduling/sync state. Reports are not sent automatically. A waiting cloud stage identifies where work is paused, not the cause of the pause.

A habit says Not due today

This means the selected date is outside that habit's schedule. Its lighter text is an obligation cue, not a disabled state: you may still mark it complete or log counter progress, and the optional log will not add the habit to that day's due total.

A completion or quick log could not be saved

Keep the app open and read the error shown on screen. A failed counter, widget, or deep-link update does not advance progress or claim success. Retry after checking available device storage and, for cross-device transport, the Cloud Sync Debug status.

Restore an export

  1. Choose the newest complete combined export, or select its complementary habits and completions files together.
  2. Check filenames/table classifications, totals, add/update counts, warnings, and exclusions in the review.
  3. Choose Confirm Import for the local merge. Canceling or any validation error makes no import change.
  4. Keep Settings open for the result. A successful result means the atomic local restore completed. Completion updates stay pending locally and are attempted only when CloudKit sync is enabled and available.
  5. Use View Cloud Sync Debug Info to monitor subsequent synchronization.

The system document picker grants temporary access only to files you select. Chain of Habits copies bounded data, releases that access on success, error, or cancellation, and does not keep permission to browse the rest of the provider.

Contact Support

Need help or want to report a bug?
AppleFeedback@robjoyce.com

Read the Chain Of Habits Privacy Policy.