This weekend:
- Fixed session refresh when the session has expired (do not need to tap "Sign in" — refreshed automatically)
- Fixed keyboard when searching/entering a Manufacturer name
- Fixed electric motor toggle behavior for "Has throttle" and "Has pedal"
- Fixed layout for Serial Number "Scan Text" button
I’m proud to introduce you to Bike Index: an open-source iOS app for the world’s leading bike registration and recovery service of the same name! Bikes mean everything to their riders: freedom of movement, ability to transport cargo, exercise and empowerment, connecting with nature and the great outdoors. Bike Index helps you recover your bike if it’s ever lost or stolen. Built with and
Direct link here https://apps.apple.com/us/app/bike-index/id6477746994
Agh!!!!
Turmoil to get there:
3. This broke the debug-only modal AuthPage > NavigationStack > Settings > Buttons append to $path
a. Settings { @.Environment(\.openURL) var openURL } was causing continuous changes to the view itself and blocking the whole UI
b. Solved by replacing OpenURL with Link(destination:label:)
.
I definitely should’ve been using a Link before but this seems like a
4. Now I need to get those disclosure indicators back in a nice way.
Alright NavigationStack + Button + navigationDestination wasn't necessary. Revisited https://developer.apple.com/documentation/swiftui/migrating-to-new-navigation-types and realized that the problem was NavigationLink(destination: () -> View, label:) and the fix is simply NavigationLink(value: Hashable?, label:) + navigationDestination. Glad I didn't spend too much time on it. Still got those speed improvements, more to test too.
+67 -504
https://github.com/bikeindex/bike_index_ios/pull/14
Why haven't you taken the Xcode "Convert to Folder" pill yet?
GitHub
Fix: Convert Xcode project groups to folders by aokj4ck · Pull Request #14 · bikeindex/bike_index_iosDescription There are several benefits to using folders instead of groups when organizing your Xcode project files. Folders have a much smaller representation in the project file, which can result...
> There are several benefits to using folders instead of groups when organizing your Xcode project files. Folders have a much smaller representation in the project file, which can result in fewer merge conflicts because when you add or remove files to the project you don’t modify the project file. Additionally, your Xcode project file automatically updates as you make changes to the file system.
— https://developer.apple.com/documentation/xcode/managing-files-and-folders-in-your-xcode-project#Convert-groups-to-folders
Today in Bike Index:
- Merged Bike ︎ User/AuthenticatedUser relationships, transactions, and frequent save() to fix the #1 crash/bug report
- Fixed GitHub "Enable auto-merge [after PR checks pass]" (gotta use jobs > build > name: Run tests with fastlane → Ruleset add checks
- Converted Xcode project groups to Folders
New in PR review:
- Added app version to Settings
- Updated README with TestFlight public beta link and incremented to version v1.1!
Phew what a day!
I haven't found explicit confirmation but the standard Swift Format config location is .swift-format
.
Both UI and CLI respect this config by default in Xcode 16.0
- Xcode > Editor > Structure > Format File with 'swift-format’
- swift format --in-place --recursive paths…
Inferred from https://github.com/swiftlang/swift-format/blob/main/Documentation/Configuration.md#linter-and-formatter-rules-configuration and trial+error
According to this article ~/.swift-format
(home directory) will also be read by Xcode/CLI https://troz.net/post/2024/swift_format/
Hm, are "Development Assets" broken on Xcode 16? I had it working before but haven't look at this preview data in a while.
I have Development Assets > json file, scanning Bundle.allBundles is not able to load this. Maybe this broke during my Convert To Folder change? This article from October is the only one I've found discussing loading json files (with the scan allBundles approach). https://medium.com/@wesleymatlock/how-to-use-swiftuis-preview-content-with-the-preview-macro-56037446603c
Medium
How to Use SwiftUI’s Preview Content with the #Preview MacroSwiftUI has transformed UI development across Apple platforms with its declarative syntax and powerful preview capabilities. With the introduction of Swift 5.9, Xcode 15, and iOS 17, new features…
Previously: Development Assets seemed broken (the post this one is replying to)
A: Fixed it with adding the assets to the build target, and to the development_assets_paths, as seen in changeset https://github.com/bikeindex/bike_index_ios/pull/50/files (and renamed the file in this change too)
Is anyone else seeing brew bundle
fail? On GitHub Actions I'm seeing a 50% failure rate
"Error: homebrew/bundle was deprecated. This tap is now empty and all its contents were either depleted or migrated.”
But it succeeds locally with brew update!
Ex: https://github.com/bikeindex/bike_index_ios/actions/runs/14283418190/job/40035917728#step:5:8
Today:
- Merged QR Sticker universal links esupport!
- Very pleased with this new test suite: ViewModel unit tests and a small start for UI tests on universal links.
- Waiting for v1.3 App Review and integration testing soon
(Sorry for two links which some clients don't display well but…)
1. How to use Bike Index QR Stickers -- order yours today! https://bikeindex.org/info/how-to-use-bike-index-qr-stickers
2. Pull request with a mad-scientist Mermaid state diagram https://github.com/bikeindex/bike_index_ios/pull/55
Previously:
1. group bikes by manufacturer https://github.com/bikeindex/bike_index_ios/pull/62
2. minor fixups
Today:
3. add expandable sections for the groups of bikes https://github.com/bikeindex/bike_index_ios/pull/65
- special thanks to @caleb for this feature suggestion
Next:
4. maybe prettify the registration page with required fields? Lots of space for clean-up and enhancements
GitHub
Feat: group Bike sections by manufacturer by aokj4ck · Pull Request #62 · bikeindex/bike_index_iosDescription Add Menu to change main content page grouping of bikes by either A) status or B) manufacturer name Grouping selection is persisted in user defaults Remove unused BikeIndexIdentifiable,...
TIL:
App Store Marketing Tools https://toolbox.marketingtools.apple.com/en-us/app-store/us?q=bike+index will generate promotional images like this one for your app. I just wish there was a text field instead of these bland "See what's new" phrases—I want to tell people exactly what is new!
Today in Bike Index:
- fixed a crash when uploading images (credit to @caleb again!)
- built the data layer for “Recently Scanned QR Stickers”, although… the @ Tests(arguments:) keep failing on “test is already running”. Not sure what’s going wrong there yet.
- next/later: UI for recently scanned stickers.
- went for a small bike ride to get dirt and potted the begonia lucerna propagations! 80° here. So glad to get moving again.
When you use Swift Testing, make sure any @\Tests(arguments:) helper arg Struct/Class conforms to CustomTestArgumentEncodable. Write the func encodeTestArgument(to encoder: some Encoder)
just like any other encoder with stable and unique values, omitting large non-unique values.
If you omit this you'll hit "encountered an error (Received unexpected event testCaseDidStart for $test (iteration 1). Test already started.)" (repeatedly)
— https://developer.apple.com/documentation/testing/customtestargumentencodable
Today is the 1-year anniversary of the Bike Index for iOS 1.0 app launch https://iosdev.space/@j4ck/112486957663316016
Today:
- fixed Recent QR Stickers persistence (keeps 10-most recent within the last 2-weeks. Maybe that's too short but it's easy to adjust later.)
- added referral_source attribution for donations
- fixed camera/photo-library usage description
- added Recent QR Stickers UI
Look how cute this is!! Now available in TestFlight beta v1.4.1 (41)
Had to write a leftpad lol remember that whole ordeal https://github.com/bikeindex/bike_index_ios/blob/main/BikeIndex/Model/Deeplinks/ScannedBike.swift#L64-L66
Okay platforms state of the union 16 minute mark notes what I'm doing wrong. "Icon Composer can export a single source to Xcode" and it works best with SVG layers. https://developer.apple.com/videos/play/wwdc2025/102/
TIL "Swift compiler diagnostics", your guide to Swift language error messages
https://docs.swift.org/compiler/documentation/diagnostics/
yay the latest Bike Index beta build _should_ fix all the incompatibilities with iOS 26 beta 1.
Mostly: removed all text Labels from Toolbars. The previous Labels with text were totally thrown off in the beta 1 simulator. See screenshot
https://testflight.apple.com/join/TVaDioGl
Yesterday in Bike Index iOS:
- merged the most rudimentary NWPathMonitor bike detail offline fallback: first steps to supplanting web views!!
- the first community pull request was opened!!
https://github.com/bikeindex/bike_index_ios/pull/85
- biked to a concert in the park
Really proud of the project set up I wrote which has no reported problems: except for GHA CI permissions which was expected. Figuring that out!
Racking my brain to find LPLinkView and it finally turned up https://developer.apple.com/documentation/linkpresentation/lplinkview
Is anyone else seeing xcrun simctl status_bar
fail to set the date on iPad simulators?
Ex:
1. xcrun simctl status_bar booted override --time "2007-01-09T14:41:00.000Z" (shout out to https://github.com/jessesquires/Nine41)
2. xcrun simctl status_bar booted override --time "2025-08-20T09:41:00-04:00"
Option 1 will set the time, but not the date. Option 2 will print an error about using ISO dates.
1/2 Previously on Bike app:
- oh uh been outside and doing other stuff a lot…
- more UI test PRs from community/friend Milo (thx Milo!)
- fixed error alerts (tip don't put a Text in an alert that doesn't do anything!)
- added Recently Scanned Stickers page so you don't immediately lose the context
- adding offline mode, secretly , with the goal of removing all these web views
- fix iOS 26 compatibility
- add validation requirements and progress to registration!
Today in Bike Index: published v1.5! https://github.com/bikeindex/bike_index_ios/releases/tag/v1.5