Back to Library

Building, testing, and releasing Library

How to build, test, and release Library, and how text is localized.

Applies to the current release of Library. Last reviewed October 15, 2026.

Build

Run ./build.sh to build the app.

On GitHub Actions, a pull request that changes code runs ./test.sh. A push to main also builds the app and renders the screens. Changes to Markdown and docs/ skip the run.

Test

Run ./test.sh to run the checks in Tests/. The checks use private pasteboards and temporary files. They never touch your clipboard or your library.

Releasing

To publish a release, push a tag such as vX.Y.Z:

Terminal
git tag vX.Y.Z
git push origin vX.Y.Z

Or run the Release workflow by hand and enter a version. Either way, GitHub Actions builds and checks the app, then publishes Library-X.Y.Z.zip. The zip holds only the source needed to build the app. Tests, workflows, docs, scripts, test.sh, and update.sh are left out.

If publishing fails with a server error, the workflow makes up to four attempts. Running it again is safe. It skips a release that already exists.

Languages

Library is in English. The text lives in Sources/Library/Resources/en.lproj/Localizable.strings.

Write each user-facing string as Text("…", bundle: L10n.bundle), or as String(localized: "…", bundle: L10n.bundle) where a String is needed. To add a string, add a line such as "key" = "value"; with a /* comment */ above it.

Dynamic text, such as file names, counts, and clipboard contents, isn't localized.