Back to Case Studies

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

Swift 5SwiftUISwiftDataClaude APIGemini APIMVVMiOS 17+

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

ChallengeSolution
Dual API key managementBuilt unified AIService protocol with strategy pattern
RSS parsing inconsistenciesUsed FeedKit with custom fallback parser for malformed feeds
Offline functionalityImplemented SwiftData caching with background sync
Memory management for large feedsPagination 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

swift
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