A magazine-style reading experience delivering curated AI news, research papers, and industry analysis. Built with SwiftUI and a clean MVVM architecture.
| Feature | Details |
|---|---|
| Home Feed | Featured banner + latest articles with pull-to-refresh |
| Explore | Category browsing across 10 AI domains with trending topics |
| Library | Bookmarks and reading history management |
| Search | Full-text article search with recent history |
| Article Reader | Clean reading view with related articles |
| Onboarding | Interest selection, notification opt-in, subscription flow |
| Subscriptions | Free / Basic / Pro tier selection UI |
| Multi-language | UI: English, Japanese, Simplified Chinese. Content locale independent of UI |
| Theming | Light / Dark / System appearance modes |
| Layer | Technology |
|---|---|
| UI Framework | SwiftUI |
| Architecture | MVVM with @StateObject / @EnvironmentObject |
| Networking | URLSession + async/await via APIClient actor |
| Logging | os.Logger with categorized subsystems |
| Localization | String(localized:) + .lproj bundles (en, ja, zh-Hans) |
| Project Gen | XcodeGen (project.yml) |
| Min Target | iOS 17.0 |
| Swift | 6.0 (strict concurrency) |
AIWeekly/
├── App/ # App entry point, scene lifecycle
├── Models/ # Article, ArticleDTO, User, enums
├── ViewModels/ # HomeViewModel, ArticleViewModel, etc.
├── Views/
│ ├── Home/ # HomeView, FeaturedBannerView
│ ├── Explore/ # ExploreView, category browsing
│ ├── Library/ # BookmarksView, HistoryView
│ ├── Profile/ # ProfileView, settings
│ ├── Article/ # ArticleReaderView
│ ├── Search/ # SearchView
│ ├── Subscription/ # SubscriptionView, plan selection
│ ├── Onboarding/ # OnboardingView, interest picker
│ └── Components/ # Shared UI components
├── Services/
│ ├── APIClient/ # Network layer (actor-based)
│ ├── Localization/ # LocalizationService, AppLocale, ContentLocale
│ ├── Logging/ # AppLogger (os.Logger categories)
│ └── Storage/ # StorageService (UserDefaults)
├── Design/ # AppFont, Spacing, Color tokens
└── Resources/
├── Assets.xcassets # App icons, colors, images
├── en.lproj/ # English strings
├── ja.lproj/ # Japanese strings
└── zh-Hans.lproj/ # Simplified Chinese strings
- Xcode 16.2+
- XcodeGen (
brew install xcodegen) - iOS 17.0+ device or simulator
- Backend API running (see
api)
-
Generate the Xcode project:
xcodegen generate -
Open
AIWeekly.xcodeprojin Xcode -
Select your target device/simulator and run
| Environment | Base URL |
|---|---|
| Simulator | http://localhost:3000/api/v1 |
| Device | http://<your-lan-ip>:3000/api/v1 |
The base URL is configured conditionally via #if targetEnvironment(simulator) in APIClient.swift.
| Language | UI Strings | Content Locale |
|---|---|---|
| English | en.lproj |
en |
| Japanese | ja.lproj |
ja |
| Simplified Chinese | zh-Hans.lproj |
zh-Hans |
Content locale is independent — users can read English articles with a Japanese UI, for example.
| Repository | Description |
|---|---|
api |
Backend API (required for data) |
android |
Android client |
web |
Web reader |
Private — All rights reserved.