A retro-styled iOS Notes app with a nostalgic 90s/2000s aesthetic. Built with SwiftUI, MVVM architecture, and Core Data.
- Xcode 15+
- iOS 17.0+
- Swift 5.9+
-
Install XcodeGen if you don't have it:
brew install xcodegen
-
Generate the Xcode project:
cd BoringNotes xcodegen generate -
Open the generated project:
open BoringNotes.xcodeproj
-
Select your development team in Signing & Capabilities, then build and run.
-
Open Xcode and create a new project:
- iOS > App
- Product Name:
BoringNotes - Interface: SwiftUI
- Language: Swift
- Storage: None (we use programmatic Core Data)
- Uncheck "Include Tests" (we add them manually)
-
Delete the auto-generated
ContentView.swiftandBoringNotesApp.swift. -
Drag the
BoringNotes/source folder into the Xcode project navigator.- Make sure "Copy items if needed" is checked.
- Add to target:
BoringNotes.
-
Add a Unit Test target:
- File > New > Target > Unit Testing Bundle
- Name:
BoringNotesTests - Drag the test files from
BoringNotesTests/into this target.
-
Configure the project:
- Set deployment target to iOS 17.0
- Add
NSFaceIDUsageDescriptionto Info.plist (already included) - Set the asset catalog in Build Settings
-
Build and run.
BoringNotes/
├── App/ # App entry point, ContentView
├── Models/ # Core Data entities, SortOption
├── Persistence/ # PersistenceController, NoteRepository
├── ViewModels/ # MVVM view models
├── Views/
│ ├── Notes/ # Notes list, editor, formatting toolbar
│ ├── Tags/ # Tag management
│ ├── Settings/ # Settings screen
│ └── Components/ # Reusable UI components
├── Theme/ # RetroTheme, ThemeManager
├── Services/ # Haptics, Sound, Biometric, Spotlight, Import/Export
├── Utilities/ # Debouncer
└── Resources/ # Asset catalog
- MVVM: Views observe
@Observableview models. - Repository Pattern:
NoteRepositoryabstracts all Core Data operations. - Programmatic Core Data Model: No
.xcdatamodeldfile needed - the model is built in code with full migration support. - Debounced Autosave: Notes auto-save 1.5 seconds after the user stops typing, using background context writes.
- Theme System: Three selectable retro themes with consistent styling applied via SwiftUI Environment.
- Create, read, edit, and delete notes
- Auto-save with debounce and "Saved" indicator
- Tags with color coding and quick filters
- Full-text search with highlighted matches
- Pin and favorite notes
- Sort by date, title, or pinned status
- Markdown-style formatting with preview mode
- Checklist support
- CRT Green: Dark background, green phosphor text, scanline overlay
- Classic Paper: Warm paper background, blue ink text, grain texture
- Terminal Amber: Black background, amber text, chunky borders
- Face ID / Touch ID lock for individual notes
- Locked notes hide preview content in the list
- Soft delete with 30-day "Recently Deleted" recovery
- Auto-purge of old deleted notes
- Import
.txtand.mdfiles - Export notes as plain text or Markdown
- Share sheet integration
- Dynamic Type support
- VoiceOver labels on all interactive elements
- Reduce Motion toggle disables scanlines and grain effects
- High contrast maintained across all themes
- iPhone: Tab bar navigation (Notes, Tags, Settings)
- iPad: NavigationSplitView with sidebar
Unit tests cover:
- CRUDTests: Note and tag create, read, update, delete operations
- AutosaveTests: Debouncer timing, cancellation, background save
- TagFilterTests: Search, tag filtering, sorting, favorites, pinned
- LockFlowTests: Lock/unlock state, authentication logic, edge cases
Run tests with Cmd+U in Xcode or:
xcodebuild test -scheme BoringNotes -destination 'platform=iOS Simulator,name=iPhone 16'All settings persist via UserDefaults:
- Theme selection
- Default sort order
- Sound and haptic toggles
- Face ID lock toggle
- iCloud sync toggle (experimental)
- Reduce motion preference