Repository navigation
Releases: cesardev31/xlinux
Release list
xlinux 0.5.1
xlinux account: know your free Apple ID quota
A free Apple ID can create at most 10 App IDs in a rolling 7-day window (every app and every app extension needs one), and Apple doesn't tell you how many you have left. xlinux account lists the App IDs on your team, how many were created in the last 7 days and when the next slot frees up.
Apple doesn't expose creation dates, so xlinux keeps its own history (<data dir>/app-ids.json). App IDs that existed before the first run are counted as created that day (worst case) and marked as estimated.
After each install, xlinux prints a one-line summary: App IDs created in the last 7 days: 9/10. Rebuilding an app that already has an App ID doesn't use a slot. Paid accounts have no such limit, so the line isn't shown for them.
Full Changelog: v0.5.0...v0.5.1
xlinux 0.5.0
Native Xcode projects: SwiftUI / UIKit apps from Linux
xlinux now builds plain Xcode projects, not just Flutter and Expo. Run xlinux run in a folder with an .xcodeproj: it builds the Debug configuration, installs and launches the app, and prints the app's own logs (system frameworks' noise is filtered out like Xcode does). Options: --release, --target, --configuration.
- Xcode 16+ projects as they are: synchronized folders, Info.plist generated from
INFOPLIST_KEY_*settings,MainActordefault isolation, approachable concurrency and upcoming features. - Macros:
#Preview,@Observable. - Asset symbols like Xcode's:
Color.brand,.foregroundStyle(.brand)(with dark variants),Image(.logo). - String Catalogs (
.xcstrings) compiled to<lang>.lproj. - App extensions (widgets): each is built from its own target's sources and resources with its own deployment target. Only the extensions in the app's Embed Foundation Extensions phase are built, so an unused target no longer takes up an App ID on a free account.
- CocoaPods when there's a
Podfile.
App Intents and Siri without a Mac
Xcode's appintentsmetadataprocessor only runs on Apple Silicon Macs. xlinux generates Metadata.appintents itself from the constant values that the Linux swiftc emits (the same as Xcode's). The format was reconstructed from a paired Xcode build, where xlinux's output matches Xcode's, and about 150 published samples.
- Intents with a title, description and
openAppWhenRun. - Parameters: String, Bool, Int, Double, Date, URL and
AppEnum. - Results: dialog, returned value, open another intent.
- App Shortcuts with
\(.applicationName)phrases, translated inAppShortcuts.xcstrings.
Tested on an iPhone: the shortcuts show up and run in the Shortcuts app, and Siri runs them in Spanish. Siri's voice matching is sometimes unreliable, and the cause hasn't been found yet. Unsupported constructs (entities, phrases with parameters) stop the build with a clear error.
Fixes
- An
.appexwithoutCFBundleNamewas rejected by iOS at install. pod installand.appassembly moved to shared code, used by the Expo and Xcode adapters. Expo builds haven't been re-tested since this change.
Known limitations of Xcode projects
Swift packages (SwiftPM dependencies), storyboards other than the launch screen, Core Data models, Metal shaders, .icon icons, named catalog colors (Color("Name")) and the global accent color aren't supported yet. There's no hot reload: every change is a rebuild and reinstall.
xlinux 0.4.0
Changes
- Add Flutter flavors to
xlinux build,xlinux run, and theflutter run -d iphone-linuxintegration. SelectDebug-<flavor>orRelease-<flavor>and pass the flavor to Flutter assemble. - Resolve Runner and extension build settings from the selected Xcode configuration, including bundle identifiers, custom Info.plist variables, entitlements, and app groups.
- Fix Flutter assemble failures with multiple DartDefines by using
--DartDefines=. - Add
xlinux device tunnel: use the configured pymobiledevice3 installation and request sudo automatically to run the kernel tunnel in the foreground. - Add regression tests and a flavored Xcode project fixture.
Validation
Five regression tests pass. Debug builds of a sample app pass with and without a QA flavor; the QA artifact's display name and bundle identifier were verified. On-device QA installation remains unverified because the connected iPhone reached its free developer profile app limit.
Example
xlinux run --flavor qa --dart-define-from-file config/qa.json
xlinux device tunnelFull changelog: v0.3.0...v0.4.0
xlinux 0.3.0
xlinux 0.2.0
xlinux 0.1.0
Full Changelog: https://github.com/cesardev31/xlinux/commits/v0.1.0