Today, we've updated Linear Mobile with an all-new design that looks great on iOS 26, and thanks to the powerful APIs #SwiftUI has been adding over the past few years, we're bringing it to iOS 18 with zero compromise.
Get the update here: https://apps.apple.com/app/linear-mobile/id1645587184
We ended up precompiling our shaders to metallib files and checking those in, just to get CI to work consistently on Xcode 26.
You can create a ShaderLibrary from a metallib url. If you go this route, make sure to cache your ShaderLibrary instance because it is expensive to generate.
Here's a fun JavaScriptCore quirk. When JavaScriptCore calls into your Swift functions with optional params, they will always receive a value, even if the caller didn't actually pass the argument, or if called with a different type.
For example, with a string param you'd get a value like "undefined" instead of nil.
Under the hood it seems to just cast whatever is passed into the expected Swift type. Safer to just use JSValue for all your parameters.
If you are spending your days doing tons of rapid iteration of your SwiftUI views as part of your iOS 26 redesign, can I recommend these two custom keyboard shortcutsâ
1) Re-map âRefresh Canvasâ to âP. I never print my code but find I need to manually refresh things very often.
2) Re-map âExport Preview Screenshot" to â„ âP. This saves a PNG screenshot of the current canvas view. I'm using this as part of my Design Diary series, but otherwise I use it all the time just to have past references.