This repository contains the client-side code for The Palace Project Palace application.
- Install Xcode 26 in
/Applications, open it and install additional components if it prompts. iOS 26 SDK is required for App Store submission as of April 2026; CI builds release artifacts on Xcode 26 /macos-26. - Install Carthage if you haven't already.
brew install carthageis recommended.
The DRM build runs natively on Apple Silicon — no Rosetta needed. (If you hit Adobe RMSDK linker errors on Apple Silicon you may need to toggle "Open using Rosetta" on Xcode.app as a fallback, but the default path no longer requires it.)
git clone git@github.com:ThePalaceProject/ios-core.git
cd ios-core
# one-time set-up
./scripts/setup-repo-nodrm.sh
# idempotent script to rebuild all dependencies
./scripts/build-3rd-party-dependencies.sh --no-privateOpen Palace.xcodeproj and build the Palace-noDRM target.
- Contact project lead and ensure you have access to all the required private repos.
- Make sure you have git-lfs installed. Installation instructions. To install with brew:
brew install git-lfs git lfs install
- Then run:
git clone git@github.com:ThePalaceProject/ios-core.git cd ios-core ./scripts/bootstrap-drm.sh - Open Palace.xcodeproj and build the
Palacetarget.
Unless the DRM dependencies change (which is very seldom) you shouldn't need to run the bootstrap-drm.sh script more than once.
Other 3rd party dependencies come from a mix of Swift Package Manager (Readium 3.x, Firebase, SQLite.swift, PureLayout, snapshot-testing, ULID, std-uritemplate, transifex), git submodules (ios-audiobooktoolkit, ios-tenprintcover, plus DRM-only submodules), and local Swift packages under Palace/Packages/ (PalaceAuth, PalaceCatalog, PalaceKeychain, PalaceLogging, PalaceNetwork).
To rebuild non-SPM dependencies use the idempotent script:
cd ios-core
./scripts/build-3rd-party-dependencies.shThe scripts directory contains other scripts for granular dependency, archive, and test runs. These scripts are the same ones CI uses. All must be run from the root of ios-core, not from the scripts directory. See scripts/README.md for a categorized reference.
develop is the main development branch.
Release branch names follow the convention: release/<version>. For example, release/1.0.0.
Feature branch names (for features whose development is a month or more): feature/<feature-name>, e.g. feature/my-new-screen.
Continuous integration is enabled on merge events on develop branch. Palace device builds are uploaded to ios-binaries.
Helping a patron whose Palace app is in a stuck state that sign-out + uninstall + reinstall does not clear? See the Reset Library Account support workflow — an interactive console with the recovery steps, an inline Device-ID → Firebase Remote Config parameter generator, and a sysdiagnose log verifier. Ships in Palace iOS 3.1.0+.
Tests are required for production changes. The full workflow — TDD discipline, the local self-check, and the public/private boundary between outside contributors and maintainer-internal agent tooling — is documented in CONTRIBUTING.md.
CI enforces coverage floors, snapshot tests, build for both Palace and Palace-noDRM targets, and a chaos-replay regression suite. Run scripts/verify-pr.sh --quick locally before opening a PR to catch failures before CI does.
Copyright © 2021 LYRASIS
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.