Native iOS Productivity Suite with Dual AI Integration
SwiftUI application featuring RSS aggregation, web scraping, and real-time AI analysis using both Claude and Gemini APIs
Overview
Developed a comprehensive iOS productivity application with four core modules: news aggregation with AI analysis, content scraping with outline generation, template-based content creation, and personal organization tools. The app integrates both Claude and Gemini APIs for different specialized tasks.
The Problem
Professionals who need to stay informed across multiple news sources while preparing content face a fragmented workflow: RSS readers, note apps, AI tools, and writing apps all exist separately. Context switching kills productivity.
Architecture Decisions
Why SwiftUI over UIKit?
Declarative syntax matches React mental model (faster development). Built-in support for iOS 17+ features (SwiftData, async/await). Better state management with @Observable macro.
Why SwiftData over Core Data?
Modern Swift-native persistence. Simpler relationship modeling. Better integration with SwiftUI's state system.
Why dual AI APIs (Claude + Gemini)?
Claude: Superior for nuanced analysis and writing tasks. Gemini: Better for summarization and speed-critical operations. Each API optimized for specific features.
Key Features
- World Watch: RSS aggregation from 15+ news sources with AI-powered spiritual/professional analysis
- Content Parser: Web scraping with automatic outline generation using AI
- Template Generator: AI-assisted content creation with customizable templates
- Personal Dashboard: Notes, bookmarks, and organization tools
Challenges & Solutions
| Challenge | Solution |
|---|---|
| Dual API key management | Built unified AIService protocol with strategy pattern |
| RSS parsing inconsistencies | Used FeedKit with custom fallback parser for malformed feeds |
| Offline functionality | Implemented SwiftData caching with background sync |
| Memory management for large feeds | Pagination with @Query and lazy loading |
Results
- ✓Aggregates 50+ articles per refresh cycle
- ✓AI analysis completes in <3 seconds per article
- ✓Offline-first architecture with seamless sync
- ✓4.8 rating from beta testers
Code Sample - Unified AI Service
protocol AIServiceProtocol {
func analyze(content: String, model: AIModel) async throws -> Analysis
func generateOutline(from html: String) async throws -> Outline
func createContent(template: Template, inputs: [String: Any]) async throws -> String
}
enum AIModel {
case claude // For analysis, nuanced writing
case gemini // For summarization, speed-critical tasks
}
final class AIService: AIServiceProtocol {
private let claudeClient: ClaudeClient
private let geminiClient: GeminiClient
func analyze(content: String, model: AIModel) async throws -> Analysis {
switch model {
case .claude:
return try await claudeClient.analyze(content)
case .gemini:
return try await geminiClient.analyze(content)
}
}
}What I'd Do Differently
- →Implement background fetch for proactive content updates
- →Add widget support for quick glance at latest analysis
- →Build share extension for analyzing content from other apps