Portfolio Demonstration Project - This repository showcases advanced native iOS development expertise through a full-featured note-taking and content capture application. The app is no longer published but represents production-quality code demonstrating senior-level iOS engineering skills.
Thinkers Notebook is a comprehensive iOS application for capturing, organizing, and collaborating on ideas through multiple content types including photos, documents, audio recordings, video, handwritten notes, and scanned notebook pages. The app demonstrates expertise across the entire iOS development stack from UI/UX to backend integration, real-time collaboration, and advanced media processing.
- UIKit - Advanced compositional layouts, diffable data sources, custom views
- SwiftUI - Modern declarative UI (43+ views) with Combine integration
- Combine - Reactive programming throughout the application
- AVFoundation - Audio/video recording, playback, and editing
- Vision Framework - Document detection, OCR, handwriting recognition
- MapKit & CoreLocation - Location-based features with custom annotations
- WidgetKit - Home screen widgets with shared authentication
- Firebase Suite - Firestore, Authentication, Storage, Functions, Analytics, ML Vision, Remote Config, Dynamic Links, Messaging
- RevenueCat - Subscription management with A/B testing capabilities
- Algolia - Full-text search integration
- OpenCV2 - Advanced image processing and document scanning
- Kingfisher - Async image loading with caching
- WordPress-Aztec-iOS - Rich text editing
- Google/Facebook/Apple Sign In - Multi-provider authentication
- SwipeCellKit - Interactive cell gestures
- MessageInputBar - Rich messaging UI
- Mixpanel - Analytics
- Fastlane - Complete automation for builds, releases, and certificate management
- SwiftGen - Type-safe resource access (assets, strings, storyboards)
- SwiftLint - Code quality enforcement
- CocoaPods - Dependency management
Sophisticated multi-section layouts with dynamic content and orthogonal scrolling sections:
[MainLayouts.swift](Thinkers Notebook/Controllers/Main/Layout/MainLayouts.swift) - Factory pattern returning complex layouts:
- Folders section with grid/list toggle (3-column grid with 12pt spacing)
- Recent notes with horizontal scrolling
- Nearby notes with embedded map views
- Dynamic section configuration based on data availability
[FolderLayouts.swift](Thinkers Notebook/Controllers/Folder/Layout/FolderLayouts.swift) - Adaptive layouts:
- Grid layout with aspect ratio calculations
- List layout with dynamic height
- Smooth transitions between layout modes
Type-safe, performant data handling with automatic animations:
[BaseDiffable.swift](Thinkers Notebook/Controllers/Base /BaseDiffable.swift) - Custom base class:
class BaseDiffable<Section: Hashable, Item: Hashable>:
UICollectionViewDiffableDataSource<Section, Item>- Empty state handling
- Supplementary view registration
- Used in 12+ view controllers
- 97% programmatic UI (only 3 storyboards, 2 XIBs)
- Demonstrates advanced Auto Layout mastery
- Custom view composition and reusability
- Eliminates merge conflicts and improves code review quality
Extensive use of Combine for reactive data flow throughout the application:
[MainViewModel.swift](Thinkers Notebook/Models/View Models/MainViewModel.swift):
- 4 concurrent Firebase listeners as publishers
@Publishedproperties for users, folders, notes, comments- Automatic UI updates via subscription chain
[LocationTracker.swift](Thinkers Notebook/Utils/Managers/LocationTracker.swift):
@Published var lastLocation: CLLocation?
@Published var placemark: CLPlacemark?- Real-time location updates
- Reverse geocoding with Combine
- Permission state management
Proper memory management with cancellables:
private var cancellables: [AnyCancellable] = []
cancellables.append(
Server.mainViewModel.$notes.sink { [weak self] notes in
self?.filteredNotes = notes.filter { $0.location != nil }
}
)[@UserDefault](Thinkers Notebook/PropertyWrappers/UserDefault.swift) - Generic UserDefaults wrapper:
@propertyWrapper
struct UserDefault<T> {
let key: String
let defaultValue: T
var wrappedValue: T {
get { UserDefaults.standard.object(forKey: key) as? T ?? defaultValue }
set { UserDefaults.standard.set(newValue, forKey: key) }
}
}
// Usage:
@UserDefault(GlobalConstants.UserDefaultKeys.interfaceListMode, defaultValue: false)
static var interfaceListMode: Bool[Reusable.swift](Thinkers Notebook/Utils/Reusable.swift) - Generic cell registration:
protocol Reusable: AnyObject {
static var reuseIdentifier: String { get }
}
extension UICollectionView {
func dequeueReusableCell<T: UICollectionViewCell>(
for indexPath: IndexPath,
cellType: T.Type = T.self
) -> T where T: Reusable {
// Type-safe dequeuing with compile-time checking
}
}[DictDecodable.swift](Thinkers Notebook/Models/Firebase Entities/Protocol/DictDecodable.swift) - Protocol with associated types:
protocol DictDecodable {
associatedtype ObjectType
static func decode(fromDict: [String: Any]) -> ObjectType?
}Multiple concrete types conforming to NoteContent protocol:
ThinkersNoteContent- Scanned notebook pages with transcriptionPhotoNoteContent- Photo collectionsDocumentNoteContent- PDFs with transcriptionAudioNoteContent- Audio files with transcriptionVideoNoteContent- Video filesWhiteboardNoteContent- Whiteboard sketchesTextNoteContent- Rich text
[AudioVisualizationView.swift](Thinkers Notebook/Controllers/Audio/Views/AudioVisualizationView.swift) (509 lines):
- Custom Core Graphics drawing for waveform rendering
- Real-time audio metering during recording
- Gradient masking for playback progress
- Scalable waveform generation from audio samples
- Dual-mode operation (recording vs. playback)
[AudioRecorderManager.swift](Thinkers Notebook/Controllers/Audio/AudioRecorderManager.swift):
- High-quality AAC encoding (320kbps, 44.1kHz stereo)
- Real-time metering with averaging
- Audio session management
- Background recording support
[CropAudioViewController.swift](Thinkers Notebook/Controllers/Audio/CropAudioViewController.swift):
- Visual audio trimming interface
- Precise timestamp selection
- Audio waveform timeline
- Non-destructive editing
[AudioPlayerManager.swift](Thinkers Notebook/Controllers/Audio/AudioPlayerManager.swift):
- Playback with time navigation
- 15-second forward/backward jumps
- Progress tracking
- Resumable playback
Vision Framework - Real-time document detection:
- [VisionRectangleDetector.swift](Thinkers Notebook/Scanner/Utils/VisionRectangleDetector.swift) -
VNDetectRectanglesRequestfor page detection - Confidence scoring for auto-capture
- Manual corner adjustment for precision
- Multi-page scanning workflow
OpenCV Integration - Advanced image processing:
- [OpenCVWrapper.mm](Thinkers Notebook/OpenCVWrappers/OpenCVWrapper.mm) - Objective-C++ bridge
- Adaptive thresholding for black & white conversion
- Morphological operations (dilation, median blur)
- Perspective correction and normalization
- Custom filters: Color, Grayscale, B&W
[DocumentTextDetector.swift](Thinkers Notebook/Utils/ML/DocumentTextDetector.swift):
VNRecognizeTextRequestfor printed text- Confidence thresholds
- Multi-language support
[HandwritingDetector.swift](Thinkers Notebook/Utils/ML/HandwritingDetector.swift):
- Handwriting recognition using Vision framework
- Text transcription from scanned notes
[ImageLabelDetector.swift](Thinkers Notebook/Utils/ML/ImageLabelDetector.swift):
- Image classification
- Content categorization
[LocationTracker.swift](Thinkers Notebook/Utils/Managers/LocationTracker.swift):
- Reactive location updates via Combine
@Published - Reverse geocoding for human-readable addresses
- Permission request handling
- Background location updates
- Distance calculations
[MapViewController.swift](Thinkers Notebook/Controllers/Map/MapViewController.swift):
- Custom annotation views with note previews
- Annotation clustering for performance
- Interactive map with note filtering
- Region management and zooming
[NoteAnnotationView.swift](Thinkers Notebook/Controllers/Map/NoteAnnotationView.swift):
- Custom MKAnnotationView subclass
- Note preview with image loading
- Tap gesture handling
Firestore Snapshot Listeners - Reactive database pattern:
Firestore.firestore()
.collection(FirebaseKeys.Collections.folders)
.whereField(FirebaseKeys.Folder.userID, isEqualTo: UserManager.userID)
.addSnapshotListener { [weak self] querySnapshot, error in
guard let folders = FirestoreDecoder.foldersFrom(query: querySnapshot) else { return }
self?.folders = folders // Triggers UI updates via @Published
}Centralized State Management:
Server.mainViewModel // ObservableObject with @Published properties
Server.update // FirestoreUpdater - write operations
Server.fetch // FirestoreFetcher - read operations
Server.storage // StorageUtils - media uploads[FirebaseModel Protocol](Thinkers Notebook/Models/Firebase Entities/Protocol/FirebaseModel.swift):
protocol FirebaseModel {
var schemaVersion: Int { get }
static func decode(fromDict: [String: Any], documentID: String) -> ObjectType?
func encode() -> [String: Any]?
}- Non-breaking migrations
- Version-specific decoding logic
- Future-proof data models
- Email/Password - Firebase Auth
- Google Sign In - OAuth flow with GIDSignIn
- Apple Sign In - ASAuthorizationController with CryptoKit
- Facebook Login - FBSDKLoginKit
- Cloud Storage - Media file uploads/downloads
- Cloud Functions - Serverless backend operations
- Remote Config - Feature flags and A/B testing
- Dynamic Links - Deep linking for sharing
- FCM - Push notifications
- Analytics - Event tracking
- Crashlytics - Crash reporting with dSYM upload
ViewModel Layer - ObservableObject with Combine:
- [MainViewModel.swift](Thinkers Notebook/Models/View Models/MainViewModel.swift) - Global application state
- [FolderViewModel.swift](Thinkers Notebook/Models/View Models/FolderViewModel.swift) - Folder-specific filtering
- [ActivityViewModel.swift](Thinkers Notebook/Models/View Models/ActivityViewModel.swift) - Comments and announcements
- [MapViewModel.swift](Thinkers Notebook/Controllers/Map/MapViewModel.swift) - Location-filtered notes
- [SubscriptionViewModel.swift](Thinkers Notebook/SwiftUI/Paywall/View Models/SubscriptionViewModel.swift) - RevenueCat integration
Data Flow Pattern:
Firestore Listener → MainViewModel (@Published) → Specific ViewModel → View
Base Controller Classes:
- [BaseViewController.swift](Thinkers Notebook/Controllers/Base /BaseViewController.swift) - Common UIViewController functionality
- [BaseTableViewController.swift](Thinkers Notebook/Controllers/Base /BaseTableViewController.swift) - Table view base
- Centralized cancellables management
- Common utilities (web URL handling, sharing)
43+ SwiftUI Views demonstrating modern declarative UI:
Paywall System:
- [PaywallContentView.swift](Thinkers Notebook/SwiftUI/Paywall/Views/PaywallContentView.swift) - Subscription UI
- [CustomVideoPlayer.swift](Thinkers Notebook/SwiftUI/Paywall/Views/CustomVideoPlayer.swift) - AVKit integration
- [SubscriptionOptionCard.swift](Thinkers Notebook/SwiftUI/Paywall/Views/SubscriptionOptionCard.swift) - Package selection
Onboarding:
- [OnboardingScreen.swift](Thinkers Notebook/SwiftUI/Onboarding/OnboardingScreen.swift) - Feature introduction
- [WelcomeScreen.swift](Thinkers Notebook/SwiftUI/Onboarding/WelcomeScreen.swift) - Initial welcome
Custom Components:
- [BlurView.swift](Thinkers Notebook/SwiftUI/Utils/BlurView.swift) - UIViewRepresentable wrapper
- [MaskedCornerRadius.swift](Thinkers Notebook/SwiftUI/Utils/MaskedCornerRadius.swift) - Custom shape modifiers
- [StorageImage.swift](Thinkers Notebook/SwiftUI/StorageImage.swift) - Async Firebase Storage image loading
4 Widget Types with shared authentication:
QuickCaptureWidget- Small widget for quick note captureQuickCaptureGridWidget- Medium widget with multiple capture optionsRecentNotesWidget- Small widget showing recent notesCommentsWidget- Medium/large widget for activity feed
Technical Implementation:
TimelineProviderwith Firebase data integrationIntentConfigurationfor user customization- Shared keychain for authentication state
@WidgetBundleBuilderfor multiple widget types- Deep linking into main app
[SubscriptionManager.swift](Thinkers Notebook/Utils/Managers/SubscriptionManager.swift) (309 lines):
- Multi-package support (monthly, 6-month, annual)
- Limited-time offer tracking with 24-hour deadlines
- Purchase restoration
- Entitlement checking ("plus" subscription tier)
- User identification for analytics
- A/B testing with Remote Config
- Firestore sync for subscription state
Features:
- Trial period handling
- Subscription status syncing
- Cross-platform entitlement checking
- Automatic renewal tracking
- Purchase error handling
[AudioVisualizationView.swift](Thinkers Notebook/Controllers/Audio/Views/AudioVisualizationView.swift):
- Core Graphics waveform rendering
- Gradient masking for progress
- Touch gesture for seeking
- Scalable rendering at any size
[TrimmerView.swift](Thinkers Notebook/Controllers/Audio/Views/TrimmerView.swift):
- Audio timeline with handles
- Visual feedback during trimming
- Precise timestamp selection
[CaptureMenu.swift](Thinkers Notebook/Controllers/Main/Views/CaptureMenu.swift):
- Animated menu presentation
- Multiple capture options
- Custom transitions
[CustomTabBar.swift](Thinkers Notebook/Controllers/Main/Views/CustomTabBar.swift):
- Custom tab bar implementation
- Center button elevation
- Animated tab switching
Kingfisher Integration:
- Memory and disk caching strategies
- SwiftUI support via
KFImage - Automatic cache invalidation
- Downsampling for performance
CropViewController:
- Interactive image cropping
- Aspect ratio constraints
- Rotation support
Custom Filters:
- CIFilter integration
- Real-time filter preview
- Filter selection UI
OpenCV Processing:
- Adaptive thresholding
- Perspective transformation
- Edge enhancement
- Noise reduction
Algolia Full-Text Search:
- [StandaloneSearchResultsController.swift](Thinkers Notebook/Controllers/Search/StandaloneSearchResultsController.swift)
- Debounced search queries
- Token-based authentication
- Custom index configuration
- Result highlighting
- Faceted filtering
Fastfile - Complete CI/CD automation:
Beta Lane - TestFlight deployment:
lane :beta do
match(type: "appstore", readonly: true)
build_app(scheme: "Thinkers Notebook")
upload_to_testflight(team_id: "120271764")
notification(title: "Beta Release Complete!")
endRelease Lane - App Store deployment:
- Git status validation (clean working tree)
- Branch validation (must be on
master) - Code signing with Match
- Build and upload
- Email notifications via Mailgun
Bump Lane - Version management:
- Major/minor/patch/build number increments
- Automatic git commit and tagging
- Push to remote repository
Certificate Management:
match development- Development certificatesmatch appstore- Distribution certificatesregister_new_device- Device provisioningnuke_all- Certificate cleanup
dSYM Management:
- Automatic download from App Store Connect
- Upload to Crashlytics for crash symbolication
- Cleanup of local files
swiftgen.yml - Type-safe resource access:
- Strings: Localized strings as type-safe enums
- Assets: Image assets with compile-time checking
- Storyboards: Type-safe view controller instantiation
Generated files eliminate magic strings and provide autocomplete.
Image Caching:
- Kingfisher memory cache with LRU eviction
- Disk cache with expiration
- Automatic downsampling for large images
- Prefetching for collection views
Firebase Query Optimization:
- Indexed queries for fast lookups
- Pagination for large datasets
- Efficient listener management
- Batch operations for writes
Memory Management:
- Weak self in closures throughout
- Proper
ListenerRegistration.remove()in deinit - ARC optimization
- Image decompression on background threads
Background Processing:
DispatchQueue.global()for heavy operations- Main thread reserved for UI updates
- Async/await patterns where applicable
UI Extensions:
- [UIView+Extensions.swift](Thinkers Notebook/Extensions/UIView+Extensions.swift) - Layout, animations, gestures
- [UIView+Shimmer.swift](Thinkers Notebook/Extensions/UIView+Shimmer.swift) - Gradient shimmer loading effect
- [UIViewController+Extensions.swift](Thinkers Notebook/Extensions/UIViewController+Extensions.swift) - Routing, sharing, alerts
Foundation Extensions:
- Date+Format.swift - Localized date formatting
- String+Extensions.swift - Validation, formatting
- Dictionary+FirebaseUtils.swift - Type-safe Firestore value extraction
Custom Managers:
- UserManager - Authentication state
- SubscriptionManager - RevenueCat integration
- AuthenticationManager - Login/signup flows
- PermissionManager - Privacy permissions
- AlertManager - Alert presentation
- NetworkMonitor - Connectivity detection
- ReviewManager - App Store review prompts
Singleton Pattern:
class Server {
static let fetch = FirestoreFetcher(userID: UserManager.userID)
static let update = FirestoreUpdater(userID: UserManager.userID)
static let mainViewModel = MainViewModel()
}Factory Pattern:
- Layout factories returning different UICollectionViewCompositionalLayout
- Cell registration factories
Dependency Injection:
- Protocol-based injection for testability
- View model injection in controllers
Observer Pattern:
- Combine publishers and subscribers
- Firebase snapshot listeners
- NotificationCenter for app lifecycle events
- Total Swift Files: 200+ files
- SwiftUI Views: 43+ files
- ViewModels: 13+ with Combine integration
- Custom UIKit Views: 30+ custom views
- Third-Party Dependencies: 25+ CocoaPods
- UI Approach: 97% programmatic (3 storyboards, 2 XIBs)
- Deployment: Fastlane automation with Match signing
- Code Quality: SwiftLint enforced
Pattern: Hybrid MVC/MVVM with Combine reactive programming
Data Flow:
Firestore (Source of Truth)
↓ (Real-time Listeners)
MainViewModel (@Published properties)
↓ (Combine subscriptions)
Feature ViewModels (Filtered/transformed data)
↓ (Data binding)
Views (UIKit/SwiftUI)
Key Principles:
- Protocol-oriented design
- Reactive programming with Combine
- Type-safe resource access
- Schema versioning for data models
- Comprehensive error handling
- Memory-efficient implementation
- Advanced Audio Processing - Custom waveform visualization with Core Graphics, real-time metering, and precise editing capabilities
- Computer Vision Pipeline - Vision + OpenCV integration for professional-grade document scanning with adaptive processing
- Modern UI Architecture - UICollectionViewCompositionalLayout with DiffableDataSource demonstrating cutting-edge UIKit patterns
- Reactive Programming - Extensive Combine usage with custom publishers, transformations, and subscription management
- Multi-Platform - iOS app + 4 widget types with shared authentication and real-time data sync
- Advanced Third-Party Integration - RevenueCat with A/B testing, Algolia search, multi-provider social auth, comprehensive Firebase suite
- SwiftUI + UIKit Hybrid - Modern SwiftUI alongside battle-tested UIKit showing expertise in both paradigms
- Protocol-Oriented Design - Generic, type-safe APIs with associated types and protocol extensions
- DevOps Excellence - Comprehensive Fastlane automation for the entire release process
- Performance Optimization - Kingfisher caching, optimized Firebase queries, background processing, and memory management
This codebase demonstrates senior-level iOS expertise across:
- ✅ Modern UI/UX implementation (UIKit & SwiftUI)
- ✅ Advanced iOS frameworks (AVFoundation, Vision, MapKit, WidgetKit)
- ✅ Reactive programming (Combine)
- ✅ Architecture patterns (MVVM, Protocol-Oriented Programming)
- ✅ Third-party integration (25+ libraries)
- ✅ Backend integration (Firebase suite)
- ✅ DevOps & automation (Fastlane, Match, SwiftGen)
- ✅ Performance optimization
- ✅ Media processing (audio, video, images)
- ✅ Computer vision & ML
- ✅ Location services
- ✅ In-app purchases & subscriptions
Note: This is a portfolio demonstration project. The app is no longer published or maintained, but represents production-quality code written to professional standards.