AnyTime is a modern SwiftUI rewrite of the original timezone calculator app.
It keeps the original "timezone calculator" idea, but the codebase is now built around SwiftUI, Swift Package Manager, XcodeGen, and a small local core package for search, persistence, and clock math.
- SwiftUI app lifecycle and views
- Local Swift package at
Packages/AnyTimeCorefor app logic and tests - Search by city, region, abbreviation, and UTC offset
- Smart paste that can extract date and timezone hints from the clipboard
- Drag reordering, swipe actions, quick
+/-1hand+/-1dcontrols - Dark mode support
- Generated Xcode project via
project.yml - GitHub Actions CI for test + simulator build
- Xcode 26.x
- macOS with command line tools installed
xcodegento generate the local Xcode projectjustif you want the shortcut commandsxcbeautifyfor readablexcodebuildoutput in local commands and upload scriptsswiftlintonly if you plan to runjust lintorjust verifyasconly if you plan to run the TestFlight upload flow
The app targets deploy to iOS 17.0+ and macOS 14.0+.
App/SwiftUI app, screens, components, theming, clipboard parsing, and launch resources.Packages/AnyTimeCore/Core models, timezone catalog/search, persistence, presentation formatting, and tests.Design/App icon source concepts.project.ymlXcodeGen project definition.justfileCommon local commands.
Generate the local Xcode project:
just generateOpen it in Xcode:
just openOr build from the command line:
just buildThe generated AnyTime.xcodeproj is intentionally not committed. Recreate it from project.yml whenever needed.
just generate
just open
just test
just build
just build-macos
just lint
just lint-fix
just verify
just testflight-auth
just testflight
just testflight-macos
just app-store-screenshots
just capture-app-store-screenshots-iosNotes:
just builddefaults togeneric/platform=iOS Simulatorjust build-macosbuilds the native macOS app targetjust build,just build-macos,just verify, and the TestFlight archive/export steps pipexcodebuildthroughxcbeautifywhen availablejust verifyruns project generation, SwiftLint, package tests, and an app buildjust lintandjust verifyrequireswiftlintjust testflightarchives a Release iOS build, exports an IPA, and uploads it withascjust testflight-macosarchives a Release macOS build, exports a PKG, and uploads it withascjust app-store-screenshots IOS_LOC_ID MAC_LOC_IDuploads local App Store screenshot directories withascjust capture-app-store-screenshots-ios IOS_LOC_IDrebuilds the iOS simulator app, captures the standard App Store scenarios, and uploads them
Build a specific simulator destination:
just build "platform=iOS Simulator,name=iPhone 16"The repo includes just testflight and just testflight-macos workflows built around App-Store-Connect-CLI for App Store Connect / TestFlight automation.
One-time setup:
- Install
ascif it is not already available. - Install
xcbeautifyif it is not already available. - Copy
.env.exampleto.env. - Fill in
ASC_APP_ID,APP_STORE_CONNECT_KEY_ID,APP_STORE_CONNECT_ISSUER_ID, andAPP_STORE_CONNECT_KEY_PATH. If macOS lives under a separate App Store Connect record, also setASC_MAC_APP_ID. - Run
just testflight-authto write a repo-local./.asc/config.json.
Then upload with:
just testflight
just testflight-macosNotes:
just testflightregeneratesAnyTime.xcodeproj, archives theAnyTimescheme forgeneric/platform=iOS, exports an IPA tobuild/testflight/ios/export/, and uploads it withasc.just testflight-macosregeneratesAnyTime.xcodeproj, archives theAnyTimeMacscheme forgeneric/platform=macOS, exports a PKG tobuild/testflight/macos/export/, uploads the PKG with Applealtool, and then usesascfor TestFlight build lookup / distribution.ASC_MAC_APP_IDis optional. If you omit it, the macOS flow falls back toASC_APP_ID.TESTFLIGHT_MAC_GROUPis optional. If you omit it, the macOS flow falls back toTESTFLIGHT_GROUP.- If an iOS group is configured, the command switches to
asc publish testflight, waits for processing, and adds the build to that beta group. - If a macOS group is configured, the command uploads the PKG first, then publishes the processed
MAC_OSbuild to that beta group. - The macOS upload path currently requires the App Store Connect API key variables in
.env, becausealtooluses them directly for package upload. - If you omit the API key variables, the upload step can still use an existing
asc auth loginsession, butxcodebuildsigning must then be satisfied by your local Xcode account setup. .envand./.asc/are ignored by git so API credentials stay local to your machine.
The repo also includes scripts/app_store_screenshots.sh, structured the same way as the release scripts under scripts/.
Upload existing local screenshots with:
just app-store-screenshots IOS_VERSION_LOCALIZATION_ID MAC_VERSION_LOCALIZATION_IDCapture and upload the standard iOS App Store screenshot set with:
just capture-app-store-screenshots-ios IOS_VERSION_LOCALIZATION_IDNotes:
- The script sources shared helpers from
scripts/lib/common.sh. - The iOS capture flow generates four screens for both iPhone and iPad: home, reference-time editor, search, and settings.
- It uploads iPhone screenshots from
screenshots/ios/iphone67/. - iPad screenshots are uploaded from
screenshots/ios/ipad129/. - macOS screenshots are uploaded from
screenshots/macos/desktop/. - You can also set
APP_STORE_SCREENSHOTS_IOS_VERSION_LOCALIZATION_IDandAPP_STORE_SCREENSHOTS_MAC_VERSION_LOCALIZATION_IDin.envand run the script without arguments.
GitHub Actions runs on every push and pull request. The workflow:
- checks out the repo
- installs
xcodegen - generates
AnyTime.xcodeproj - runs
swift test --package-path Packages/AnyTimeCore - builds the
AnyTimescheme forgeneric/platform=iOS Simulator
Workflow file:
.github/workflows/ci.yml
The clipboard parser can resolve:
- dates and times from freeform text
- explicit timezone IDs such as
Asia/Tokyo - UTC/GMT offsets such as
UTC+9 - city-style queries through the local search index
- additional city resolution through geocoding
On supported iOS 26 devices, the app can also use Apple's local Foundation Models APIs as a best-effort hinting layer.