A native iOS client for Discourse forums, built with UIKit + Swift.
English | 中文
| Home | Topic Detail | Categories |
|---|---|---|
![]() |
![]() |
![]() |
- Multi-Forum Management — Add, switch, and remove multiple Discourse instances
- Topic Browsing — Latest / Top topic lists with infinite scrolling
- Categories & Tags — Browse topics by category or tag
- Topic Detail — HTML content rendering, image viewer, code blocks, collapsible sections
- Reply & Create Topic — Reply to topics or specific posts, publish new topics
- Notifications — Real-time notification updates via MessageBus long-polling
- Private Messages — View messages with unread indicators, mark as read on tap
- Secure Auth — RSA-based Discourse User API Key authentication with Keychain storage
- Appearance — System / Light / Dark mode with custom theme color support
| Component | Detail |
|---|---|
| Language | Swift 5 |
| UI Framework | UIKit |
| Minimum Target | iOS 15.0 |
| Architecture | MVVM + @Observable |
| Build Tool | Tuist |
| Database | SQLite (GRDB) |
| Networking | Alamofire |
| Image Loading | SDWebImage |
| Image Viewer | Lightbox |
- Xcode 16+
- mise (runtime version manager)
# Install tools, fetch dependencies, and generate the Xcode project
make setup
# Re-generate the project only
make generate
# Clean
make cleanOpen the generated dexo.xcodeproj, select your development team, then build and run.
dexo/
├── Core/
│ ├── Auth/ # Auth flow, Keychain, RSA encryption
│ ├── Networking/ # DoH URLProtocol
│ ├── Observable/ # ObservableViewController base class
│ └── Settings/ # App preferences
├── Database/ # GRDB database manager & models
├── Features/
│ ├── ForumList/ # Forum list
│ ├── ForumDetail/
│ │ ├── Home/ # Latest / Top topics
│ │ ├── Categories/ # Category browsing
│ │ ├── Tags/ # Tag-based browsing
│ │ ├── Messages/ # Private messages
│ │ ├── Notifications/ # Notifications
│ │ └── TopicDetail/ # Topic detail & replies
│ └── Settings/ # Settings
├── Networking/
│ ├── DiscourseAPI.swift # API client
│ ├── DiscourseRouter.swift # Route definitions
│ └── Models/ # API response models
└── Assets.xcassets/


