main
ReadeckFrugal
A multiplatform Apple client (iOS / iPadOS / macOS) for Readeck — read your saved web pages offline.
Stack
- Language: Swift
- UI: SwiftUI
- Persistence: SwiftData
- Networking: Moya (async/await wrapper)
- Module layout: Swift Package Manager (local package in
Modules/)
Layout
ReadeckMobile/
├── App/ # Thin app shell (added to Xcode project)
│ ├── ReadeckFrugalApp.swift # @main, ModelContainer wiring
│ └── ReadeckFrugal.entitlements # macOS sandbox + network client
├── Modules/ # Local SPM package
│ ├── Package.swift
│ ├── Sources/
│ │ ├── ReadeckCore/ # SwiftData @Model types + credentials store
│ │ ├── ReadeckNetworking/ # Moya TargetType, async client, sync service
│ │ └── ReadeckFeatures/ # SwiftUI screens (List, Reader, Settings)
│ └── Tests/
└── README.md
Module dependency graph:
ReadeckFeatures ──► ReadeckNetworking ──► ReadeckCore
└──────────────────────────────────► ReadeckCore
Verify the package
From the repo root:
cd Modules
swift build
swift test
Create the Xcode project
The Xcode project is generated by Xcode itself — it is not committed.
- Open Xcode → File ▸ New ▸ Project…
- Pick Multiplatform ▸ App.
- Name it
ReadeckFrugal. Save it inside the repo root (/Users/juraldinio/ReadeckMobile) with Create Git repository unchecked (this folder is already a git repo). - Delete the auto-generated
ReadeckFrugalApp.swiftandContentView.swiftinside the new project. - Drag the
App/folder into the Xcode project so it joins the app target (ReadeckFrugalApp.swift,ReadeckFrugal.entitlements). - Drag the
Modules/folder into the Project navigator (root level, not into a target). Xcode will recognise it as a local Swift package. - Select the app target → General ▸ Frameworks, Libraries, and Embedded Content →
+ → add
ReadeckCore,ReadeckNetworking,ReadeckFeatures. - Select the app target → Signing & Capabilities → set the entitlements file
path to
App/ReadeckFrugal.entitlements. - Build and run on iOS, iPadOS, or macOS.
Configure a Readeck server
On first launch the app shows the onboarding settings screen. Enter:
- Server URL — e.g.
https://readeck.example.com - API token — generated in your Readeck profile under API Tokens
Credentials are stored in UserDefaults for now. Swap
UserDefaultsCredentialsStore for a Keychain implementation before shipping.
Description
Languages
Swift
86.6%
Python
13.4%