Files
lanework/KanbanMobile/Info.plist
T
rzen 1c16bb4c38 The board chooses where it lives — swipe-open settings move it between iCloud and this iPhone
A trailing swipe on a board row opens Board Settings, whose first setting is location: iCloud or Local, with a confirmed move to the other side — destructive-styled only outbound, because leaving iCloud is the direction that sheds protection. The move is setUbiquitous against the real container and a coordinated move under the DEBUG stand-in; evacuation sweeps materialization first and refuses honestly while content is still downloading. The local home is the sandbox Documents folder, published to the Files app, so a local board is still a folder the user owns.

With a second home the iCloud wall softens (user-ruled 2026-08-08): the index always reaches ready, cloud unavailability becomes an inline notice with a retry, creates land locally when there is no account, and LANEWORK_FORCE_NO_ICLOUD makes that state reproducible in tests regardless of the machine's sign-in. Known gap, now user-reachable: backup remains iCloud-only, so local boards sit outside it.

Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
2026-08-08 10:56:39 -04:00

131 lines
4.4 KiB
Plaintext

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Lanework</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>Lanework</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>© 2026 rzen</string>
<key>UILaunchScreen</key>
<dict/>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
<!-- Document-based, so App Store Connect requires this (indie-backup skill ▸ Register the
Backup File Type) — the in-place editing the imported-backup `onOpenURL` handler
(MobileApp.swift) relies on. -->
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<!-- Publishes the sandbox's Documents/ as "On My iPhone ▸ Lanework" in the Files app — the
device home (`DeviceHomeResolver`), which is where a board that is not in iCloud lives.
Without this a local board would be a real board the user could not reach, back up by
hand, or move off the phone any way except through this app, which is not what "local"
is allowed to mean here. -->
<key>UIFileSharingEnabled</key>
<true/>
<!-- Same document-type + UTI declaration as the Mac app's Info.plist, and it must stay
byte-identical in meaning: the package conformance is what makes NSMetadataQuery and the
Files app treat a `.kanban` directory as one document instead of a folder of loose files.
The iOS app *exports* the type because it is a separate App Store product — on this
platform, it is the owner. -->
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeName</key>
<string>Lanework Board</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSItemContentTypes</key>
<array>
<string>dev.rzen.indie.kanban-board</string>
</array>
<key>LSTypeIsPackage</key>
<true/>
</dict>
<!-- The backup archive IndieBackup writes/reads (indie-backup skill), so Files, AirDrop
and share sheets route a tapped `.kanbanbackup` file to this app's `onOpenURL`
instead of leaving it unopenable. -->
<dict>
<key>CFBundleTypeName</key>
<string>Lanework Backup</string>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>dev.rzen.indie.kanban-backup</string>
</array>
</dict>
</array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>com.apple.package</string>
<string>public.directory</string>
</array>
<key>UTTypeDescription</key>
<string>Lanework Board</string>
<key>UTTypeIdentifier</key>
<string>dev.rzen.indie.kanban-board</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>kanban</string>
</dict>
</dict>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeDescription</key>
<string>Lanework Backup</string>
<key>UTTypeIdentifier</key>
<string>dev.rzen.indie.kanban-backup</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>kanbanbackup</string>
</array>
</dict>
</dict>
</array>
<!-- Publishes the container's Documents/ as a visible folder in iCloud Drive — on every
platform, including the Mac's Finder, which is how boards reach the Mac app before it
adopts the container natively (open panel into iCloud Drive ▸ Lanework). -->
<key>NSUbiquitousContainers</key>
<dict>
<key>iCloud.dev.rzen.indie.Kanban</key>
<dict>
<key>NSUbiquitousContainerIsDocumentScopePublic</key>
<true/>
<key>NSUbiquitousContainerName</key>
<string>Lanework</string>
<key>NSUbiquitousContainerSupportedFolderLevels</key>
<string>Any</string>
</dict>
</dict>
</dict>
</plist>