Skip to main content

Independent Native iOS App

Note Nest connects notes, folders, formatted writing, and local reminders in a private iOS workspace with on-device storage.

Role
iOS Developer & Product Designer
Platform
iPhone & iPad (iOS 17+)
Timeline
2026 - Present
Status
In Development

Project Origin

Turning iOS foundations into a native product.

Note Nest began as a deliberate effort to bring the iOS concepts I had developed into a substantial native application. Coming from other languages and frameworks, I wanted to work through Apple's declarative UI, state management, persistence, and system-integration patterns within a larger project rather than through isolated examples.

I deliberately chose a familiar notes product so the product idea would not distract from the engineering. The goal was to independently design and structure a cohesive native application, write tests for its critical behavior, refactor its architecture, and continue evolving it.

The Problem

Notes and reminders lose context when they live apart.

Notes preserve the thinking behind an idea, while reminder apps preserve its next action. Split across separate tools, the context and its time-sensitive follow-up can drift apart.

The Solution

Keep the note and its next action together.

Note Nest lets users write, organize, and schedule a local reminder from the same note, keeping context and action connected.

Product Structure

One navigation model that adapts to the device.

At compact width, a folder-first NavigationStack leads from folders to note lists and detail. At regular width, the same content becomes a two-column NavigationSplitView. Reminders, importance, and pinning stay attached to notes, while Settings remains a secondary toolbar destination.

Note Nest library with Recents, Favorites, folders, search, and quick capture.
A scheduled Note Nest reminder in iOS Notification Center.
The Note Nest Home Screen widget showing recent note previews.
The core library, a local reminder in Notification Center, and the Home Screen widget.

Writing & Editor

Format with portable Markdown

Selection-aware formatting keeps Markdown portable, with title and body editing plus direct controls for folders, importance, pinning, and reminders.

Organization & Recovery

Organize and recover notes

Folders, unfiled notes, Recents, Favorites, sorting, bulk actions, undo, and 30-day Recently Deleted recovery keep larger libraries manageable.

Local Reminders

Keep reminders synchronized

Permission handling, scheduling, rescheduling, cancellation, relaunch reconciliation, and deep links keep local notifications aligned with their notes.

Apple System Integration

Extend notes across iOS

App Intents support capture, search, and opening notes, while Core Spotlight indexing routes system search results into the matching note.

Privacy & Offline Design

Private by architecture, not only by policy.

Note Nest was intentionally designed as a local-first application. Notes, folders, settings, and reminder information remain on the user’s device unless the user intentionally exports a copy.

  • No Accounts

    Works without registration or user identity.

  • No Backend

    No cloud API or server dependency.

  • No Analytics

    No telemetry or behavioral tracking.

  • No Third-Party SDKs

    Built entirely with native Apple frameworks.

Architecture & Persistence

Feature-based layering with stateless use cases over SwiftData.

SwiftUI views own presentation state, stateless use-case types coordinate workflow rules, and repositories provide focused SwiftData operations. First-party service boundaries handle notifications and Spotlight indexing. The use-case layer stays stateless because SwiftData's @Query already owns live data, avoiding a second source of truth and keeping operating-system coordination outside the persistence layer.

  • Interface Layer

    SwiftUI Views

    Capture intent and present explicit loading, validation, permission, and recovery states.

  • Workflow Layer

    Stateless Use Cases

    Validate drafts and coordinate note, folder, and reminder lifecycle rules without holding a second source of truth.

  • Persistence Layer

    Repositories + SwiftData

    Store notes and folders locally through focused data operations and a versioned schema contract.

  • Platform Boundary

    Apple System Services

    Coordinate local reminders, system search, App Intents, and deep routes through first-party frameworks.

Persistence Strategy

Local persistence without silent data loss.

Beyond storage, the data layer defines how mutations fail safely and how content remains recoverable. Its reliability rules cover folder relationships, failed-write rollback, reversible deletion, and explicit store recovery.

Folder-safe relationships

Notes can remain unfiled. Deleting a folder clears its note relationships instead of deleting the notes.

Rollback on failed writes

Repositories centralize SwiftData mutations and roll back the model context when a save fails.

Recoverable deletion

Removing a note records a deletion date, enabling undo, restore, and automatic purge after 30 days.

Schema and store recovery

A frozen initial schema establishes a versioned data contract. If the store cannot open, Note Nest presents retry and confirmed local reset paths.

Reminder Lifecycle

Saving the note and delivering the alert are separate outcomes.

Saving a reminder requires coordination between the persisted note and its scheduled local notification. Note Nest handles scheduling, rescheduling, completion, deletion, relaunch reconciliation, and notification-tap deep routing while allowing persistence and system delivery to report separate outcomes.

  1. 01
    Note Draft Editor

    Validate note draft

    Enforces required titles and future date requirements when reminders are active.

  2. 02
    SwiftData Repository

    Persist note & relationships

    Saves writing content, folder association, importance flags, and reminder timestamps.

  3. 03
    UserNotifications Service

    Synchronize OS request

    Schedules, updates, or cancels the system alert matching the stable note identifier.

  4. 04
    App Bootstrap

    Reconcile & route on launch

    Restores missing alerts on launch and deep-links directly to notes tapped from notifications.

Testing & Quality

Test design targets critical data and lifecycle behavior.

The XCTest source covers persistence, editing, recovery, search, folders, trash, Spotlight, and notification lifecycle behavior. Several cases were added after an August 2026 source review identified potential edge cases and failure paths.

These checks describe implemented test source, not verified passing coverage. The current native revision has not yet been compiled or executed.

  • Data & Recovery

    SwiftData bootstrap, frozen schema contract, recoverable store failures, and versioned JSON export fidelity.

  • Folder Lifecycle

    Folder deletion, unfiled-note reachability, bulk actions, undo, and 30-day Recently Deleted behavior.

  • Editor Fidelity

    Rich-text formatting and Markdown round-trip across editor, storage, preview, and detail rendering.

  • Search & Indexing

    App-wide search semantics, diacritic matching, and the fields published to Core Spotlight.

  • Reminder Lifecycle

    Reminder scheduling, cancellation, reconciliation, partial failures, stable identifiers, and deep routing through test doubles.

Retrospective

Lessons from building Note Nest

Treat failure recovery as part of the user experience

Persistence failure options, notification retries, and destructive confirmations belong in the application UI, not hidden in logs.

Decouple persistence from system services

A saved note should remain persistently stored even if notification permissions are denied or scheduling encounters a system delay.

Product readiness extends beyond feature code

Building the native app is only part of software development: privacy policies, support routes, data migration, testing, and distribution setup complete the product.

Tests are only as strong as their assertions

A structured source review identified behavior the existing assertions did not cover, including export fields that were never checked. A model change is not complete until persistence, export, rendering, and the assertions all move with it.

Let's build something that holds up.