# Sofapps > Sofapps designs, builds and looks after its own apps for iPhone, iPad, Mac, Apple Watch and Apple Vision Pro. Consulting for companies on the Apple ecosystem. Sofapps is a small Italian software house founded by Costantino Pistagna. It makes its own apps for the Apple ecosystem (Swift and SwiftUI only) and builds apps for companies. The site is in English (root) and Italian (/it/). Every page has a Markdown version: add index.md to its URL. ## Apps - [Voltidia](https://www.sofapps.it/voltidia/index.md): Voltidia shows charge level, range, charging costs, solar forecasts and a monthly report for Renault group electric cars, on iPhone and Apple Watch. (iPhone, iPhone Duo, Apple Watch; App Store: https://apps.apple.com/gb/app/id6755406140). Its own site, in English, Italiano, Deutsch, Français, Español; overview: https://www.sofapps.it/voltidia/llms.txt - [Voltidia: Contact and assistance](https://www.sofapps.it/voltidia/contact/index.md): How to reach the Voltidia team and what to include in your message so we can help you quickly. - [Voltidia: Disclaimer](https://www.sofapps.it/voltidia/disclaimer/index.md): Voltidia is an independent app, not affiliated with, endorsed or sponsored by Renault. Read about trademarks, estimates and the use of Renault's online services. - [Voltidia: Privacy policy](https://www.sofapps.it/voltidia/privacy/index.md): Voltidia collects nothing: no account with us, no server of ours, no analytics, no tracking. Read what the app stores on your device and which services it contacts. - [Voltidia: Support and FAQ](https://www.sofapps.it/voltidia/support/index.md): Answers to common questions about Voltidia: compatible cars, signing in, data freshness, notifications, widgets, Apple Watch, charging schedules, iCloud and your purchase. - [MLX Benchmarks](https://www.sofapps.it/mlxbenchmarks/index.md): MLX Benchmarks measures how fast large language models run on iPhone, iPad and Mac with Apple’s MLX, and compares your device with the community. (iPhone, iPad, iPhone Duo; App Store: https://apps.apple.com/us/app/id6755789186). In Italian: https://www.sofapps.it/it/mlxbenchmarks/index.md - [Prezzi Carburante](https://www.sofapps.it/prezzicarburante/index.md): Prezzi Carburante is a free app with up to date petrol, diesel, LPG and methane prices at the stations near you in Italy, from the ministry’s open data. (iPhone, iPad, iPhone Duo; App Store: https://apps.apple.com/it/app/id1617891488). In Italian: https://www.sofapps.it/it/prezzicarburante/index.md - [Grade](https://www.sofapps.it/grade/index.md): Grade turns a GPX or FIT route into a ride on your smart trainer, with the real gradient, the map and the profile, on iPhone, iPad, Mac and Apple Watch. (iPhone, iPad, iPhone Duo, Mac, Apple Watch; coming soon, not on the App Store yet). Its own site, in English, Italiano, Deutsch, Français, Español; overview: https://www.sofapps.it/grade/llms.txt - [I built a fake trainer so I could build the real one · GRADE](https://www.sofapps.it/grade/diary/ho-costruito-un-rullo-finto/index.md): How you build an app that talks to hardware, when the hardware is not there. - [The number that was meant to tell you whether you are improving · GRADE](https://www.sofapps.it/grade/diary/il-numero-che-doveva-dirti-se-stai-migliorando/index.md): Building a single index that works for a beginner and for a professional is harder than it looks. Mine broke twice on a real user, and in the end the right answer was to remove it. - [The trainer told me forty-two revolutions per minute · GRADE](https://www.sofapps.it/grade/diary/il-rullo-mi-ha-detto-42-rpm/index.md): Indoor cycling apps are full of fixed numbers chosen by someone who did not know who would be pedalling. On a beginner, a fixed number is not imprecise: it is wrong, and sometimes it hurts. - [Diary · GRADE](https://www.sofapps.it/grade/diary/index.md): An occasional diary. Milestones, the problems that ate a week, and the measurements that proved me wrong. This is the story of this project. Stories for people who build, and for people who love to ride. - [A week reading papers before writing a single line · GRADE](https://www.sofapps.it/grade/diary/una-settimana-di-paper/index.md): The power needed to ride a bike has an equation, it dates from 1998, and you can reproduce it numerically to find out whether you understood it. On the difference between a law, a validated model and a convention. - [Privacy policy · GRADE](https://www.sofapps.it/grade/privacy/index.md): Grade has no servers of its own and doesn't collect your personal data. - [Support · GRADE](https://www.sofapps.it/grade/support/index.md): Do you have a problem with Grade or a question? Write to us: the message already starts with the information we need, you just fill in the lines. - [Terms of use · GRADE](https://www.sofapps.it/grade/terms/index.md): Grade is developed by Sofapps di Costantino Pistagna, VAT number 05197020877, who can be reached at info [at] sofapps.it. ## Articles (English) - [Liquid Glass vs Material 3: The End of Convergence in Mobile Design](https://www.sofapps.it/blog/liquid-glass-vs-material-3/index.md): Apple's Liquid Glass and Google's Material 3 Expressive pull mobile design apart, ending years of convergence and forcing new choices on app developers. - [WWDC25: Hello, Liquid Glass](https://www.sofapps.it/blog/wwdc25-liquid-glass/index.md): How Apple's design went from the skeuomorphism of 2007 to iOS 7 flat minimalism and now Liquid Glass, and why glass suits layered, spatial interfaces. - [Dynamic Island: Neverland and the new iPhone 14 Pro](https://www.sofapps.it/blog/dynamic-island-iphone-14-pro/index.md): The Dynamic Island on iPhone 14 Pro: how Apple turned the notch, born with iPhone X in 2017, into a software feature, and why it feels like a stroke of genius. - [App Tracking Transparency using Combine](https://www.sofapps.it/blog/app-tracking-transparency-combine/index.md): How to wrap ATTrackingManager and ASIdentifierManager in an ObservableObject with Combine, to ask for tracking consent and read the advertising ID. - [SwiftUI within UIKit: Connecting two worlds](https://www.sofapps.it/blog/swiftui-within-uikit/index.md): How to move only the content of a UITableViewCell to SwiftUI through UIHostingController and Combine notifications, with no scrolling issues. - [Apple Silicon: Back to the future](https://www.sofapps.it/blog/apple-silicon-back-to-the-future/index.md): Why the M1 may be for computers what the iPhone was for phones in 2007: Apple's hardware and software integration, and a lead rivals will struggle to close. - [SwiftUI Programming: ObjectBinding and BindableObject](https://www.sofapps.it/blog/swiftui-programming-objectbinding/index.md): How to share a class based model between SwiftUI views with @ObjectBinding and BindableObject, using Combine PassthroughSubject to notify changes. - [SwiftUI Programming: An Introduction to States](https://www.sofapps.it/blog/swiftui-programming-states/index.md): How @State ties a SwiftUI view to its data, why this beats the UIKit controller approach, and how to extract subviews and pass a model to them. - [SwiftUI Programming: Building more complex views](https://www.sofapps.it/blog/swiftui-programming-complex-views/index.md): How to build a custom table view cell in SwiftUI with VStack, HStack, Image and Spacer, and how the ViewBuilder closure composes views without addSubview. - [SwiftUI Programming: Classes and Structs in SwiftUI](https://www.sofapps.it/blog/swiftui-programming-classes-structs/index.md): Why a class cannot simply replace a struct as a SwiftUI View, what error the compiler gives, and how a final class makes it possible when needed. - [SwiftUI Programming: The View Object](https://www.sofapps.it/blog/swiftui-programming-view-object/index.md): What a View is in SwiftUI: a struct conforming to a protocol with a single body requirement, and how opaque types differ from plain protocols. - [SwiftUI Programming: An Introduction](https://www.sofapps.it/blog/swiftui-programming-introduction/index.md): Why SwiftUI marks a break with UIKit and MVC: a declarative framework where the interface is derived from state. Notes that open a series of tutorials. - [TextField and UIViewRepresentable](https://www.sofapps.it/blog/textfield-uiviewrepresentable/index.md): How to work around the TextField limits of iOS 13 beta 2 by wrapping UITextField and its delegate in a UIViewRepresentable, with focus moving between fields. - [A TicTacToe game in SwiftUI](https://www.sofapps.it/blog/tictactoe-swiftui/index.md): Build a working TicTacToe game in under 160 lines of SwiftUI: a Combine-backed model, a SquareView bound to it, and an alert when the game ends. - [iPadOS, Catalyst and Sidecar](https://www.sofapps.it/blog/ipados-catalyst-sidecar/index.md): After a week with an iPad Pro and a Bluetooth keyboard: why iPadOS, Catalyst and Sidecar matter more than the hardware, even if it won't replace my MacBook Pro. - [SwiftUI programming](https://www.sofapps.it/blog/swiftui-programming/index.md): Why SwiftUI marks a turning point for Apple platforms: a declarative framework where the interface is derived from state, and what changes from MVC. - [WWDC18: ARKit2 a 2D tracking performances comparison](https://www.sofapps.it/blog/arkit2-image-tracking-performance/index.md): A practical ARKit 2 case study: tracking business cards with ARImageTrackingConfiguration on iOS 12, plus a workaround for the poorer tracking on iOS 11. - [Custom CloudKit sharing workflow](https://www.sofapps.it/blog/custom-cloudkit-sharing/index.md): A CloudKit sharing workflow without UICloudSharingController: a public record stores the CKShare URL so friends can fetch private data without share dialogs. - [Stored properties and extensions: a pure Swift approach](https://www.sofapps.it/blog/swift-stored-properties-extensions/index.md): Swift extensions cannot hold stored properties. A pure Swift workaround with a static Holder, then a per-instance dictionary keyed by memory address. - [Building a HomeKit accessory](https://www.sofapps.it/blog/homekit-accessory-arduino/index.md): How to build a HomeKit accessory with a Raspberry Pi running Homebridge and an Arduino YUN: a gate remote and a DHT22 sensor controlled with Siri. - [Face ID is a huge step forward](https://www.sofapps.it/blog/face-id-step-forward/index.md): Why Face ID is more than a biometric password: the TrueDepth sensor, a learning engine that adds context awareness, and why the published attacks prove little. - [Tales from the future](https://www.sofapps.it/blog/tales-from-the-future/index.md): A failed Instagram post sets off a thought experiment on camera permissions and the iPhone X TrueDepth camera, and on why iOS should show when it is in use. - [A Swift extension for String and HTML](https://www.sofapps.it/blog/swift-string-html-extension/index.md): Convert HTML strings into NSAttributedString with a native Swift String extension, set font, size and color through CSS, and read the document attributes. - [iPhone X and peripheral vision](https://www.sofapps.it/blog/iphone-x-peripheral-vision/index.md): How the iPhone X Safe Area and peripheral vision shape app layout: screen zones, landscape insets and aspect ratios compared with the iPhone 8. ## Articoli (italiano) - [Liquid Glass vs Material 3: la fine della convergenza nel design mobile](https://www.sofapps.it/it/blog/liquid-glass-vs-material-3/index.md): Liquid Glass di Apple e Material 3 Expressive di Google allontanano il design mobile, chiudendo anni di convergenza e ponendo nuove scelte a chi sviluppa app. - [WWDC25: Benvenuto Liquid Glass](https://www.sofapps.it/it/blog/wwdc25-liquid-glass/index.md): Come il design Apple è passato dallo skeuomorfismo del 2007 al minimalismo di iOS 7 fino a Liquid Glass, e perché il vetro si presta alle interfacce a livelli. - [Dynamic Island: L'isola che non c'è ed il nuovo iPhone 14 Pro](https://www.sofapps.it/it/blog/dynamic-island-iphone-14-pro/index.md): La Dynamic Island di iPhone 14 Pro: come Apple trasforma il notch, nato con iPhone X nel 2017, in una funzione software, e perché sembra un colpo di genio. - [App Tracking Transparency con Combine](https://www.sofapps.it/it/blog/app-tracking-transparency-combine/index.md): Come incapsulare ATTrackingManager e ASIdentifierManager in un ObservableObject con Combine, per chiedere il consenso al tracking e leggere l'advertising ID. - [SwiftUI dentro UIKit: collegare due mondi](https://www.sofapps.it/it/blog/swiftui-within-uikit/index.md): Come portare in SwiftUI solo il contenuto di una UITableViewCell, usando UIHostingController e notifiche Combine, senza problemi di scrolling. - [Apple Silicon: ritorno al futuro](https://www.sofapps.it/it/blog/apple-silicon-back-to-the-future/index.md): Perché l'M1 potrebbe essere per i computer ciò che l'iPhone fu nel 2007: l'integrazione tra hardware e software di Apple e un vantaggio difficile da colmare. - [Programmare in SwiftUI: ObjectBinding e BindableObject](https://www.sofapps.it/it/blog/swiftui-programming-objectbinding/index.md): Come condividere un modello basato su class tra view SwiftUI con @ObjectBinding e BindableObject, notificando i cambi con il PassthroughSubject di Combine. - [Programmare in SwiftUI: introduzione agli stati](https://www.sofapps.it/it/blog/swiftui-programming-states/index.md): Come @State lega una view SwiftUI ai suoi dati, perché supera l'approccio dei controller UIKit e come estrarre subview e passare loro un modello. - [Programmare in SwiftUI: costruire view più complesse](https://www.sofapps.it/it/blog/swiftui-programming-complex-views/index.md): Come costruire in SwiftUI una cella personalizzata con VStack, HStack, Image e Spacer, e come la closure ViewBuilder compone le view senza addSubview. - [Programmare in SwiftUI: class e struct in SwiftUI](https://www.sofapps.it/it/blog/swiftui-programming-classes-structs/index.md): Perché una class non può sostituire direttamente una struct come View in SwiftUI, quale errore dà il compilatore e come una final class risolve il problema. - [Programmare in SwiftUI: l'oggetto View](https://www.sofapps.it/it/blog/swiftui-programming-view-object/index.md): Cos'è una View in SwiftUI: una struct che adotta un protocol con un solo requisito, il body, e come gli opaque type si differenziano dai protocol. - [Programmare in SwiftUI: introduzione](https://www.sofapps.it/it/blog/swiftui-programming-introduction/index.md): Perché SwiftUI segna una rottura con UIKit e con MVC: un framework dichiarativo in cui l'interfaccia deriva dallo stato. Gli appunti che aprono una serie. - [TextField e UIViewRepresentable](https://www.sofapps.it/it/blog/textfield-uiviewrepresentable/index.md): Come aggirare i limiti del TextField di iOS 13 beta 2 incapsulando UITextField e il suo delegate in una UIViewRepresentable, con il focus tra i campi. - [Un gioco TicTacToe in SwiftUI](https://www.sofapps.it/it/blog/tictactoe-swiftui/index.md): Un TicTacToe funzionante in meno di 160 righe di SwiftUI: un model basato su Combine, una SquareView collegata ad esso e un alert a fine partita. - [iPadOS, Catalyst e Sidecar](https://www.sofapps.it/it/blog/ipados-catalyst-sidecar/index.md): Dopo una settimana con un iPad Pro e una tastiera bluetooth: perché iPadOS, Catalyst e Sidecar contano più dell'hardware, pur senza sostituire un MacBook Pro. - [Programmare con SwiftUI](https://www.sofapps.it/it/blog/swiftui-programming/index.md): Perché SwiftUI segna una svolta per le piattaforme Apple: un framework dichiarativo in cui l'interfaccia deriva dallo stato, e cosa cambia rispetto a MVC. - [WWDC18: ARKit 2, confronto delle prestazioni del tracking 2D](https://www.sofapps.it/it/blog/arkit2-image-tracking-performance/index.md): Un caso pratico con ARKit 2: tracciare biglietti da visita con ARImageTrackingConfiguration su iOS 12 e aggirare il tracking più debole di iOS 11. - [Un workflow di sharing personalizzato con CloudKit](https://www.sofapps.it/it/blog/custom-cloudkit-sharing/index.md): Condividere dati con CloudKit senza UICloudSharingController: un record pubblico conserva l'URL del CKShare e gli amici leggono i dati privati senza dialoghi. - [Stored properties ed extension: un approccio Swift puro](https://www.sofapps.it/it/blog/swift-stored-properties-extensions/index.md): Le extension di Swift non hanno stored properties. Una soluzione Swift pura con una struct Holder statica, poi con un dizionario indicizzato per istanza. - [Creiamo un accessorio per HomeKit](https://www.sofapps.it/it/blog/homekit-accessory-arduino/index.md): Come costruire un accessorio HomeKit con Raspberry Pi e Homebridge più un Arduino YUN: un telecomando per il cancello e un sensore DHT22 comandati con Siri. - [Racconti dal futuro](https://www.sofapps.it/it/blog/tales-from-the-future/index.md): Un post su Instagram che non parte innesca un'ipotesi sui permessi della fotocamera e sulla TrueDepth dell'iPhone X, e su perché iOS dovrebbe segnalarne l'uso. - [Perché Face ID è un salto nel futuro](https://www.sofapps.it/it/blog/face-id-step-forward/index.md): Perché Face ID è più di una password biometrica: il sensore TrueDepth, un motore che apprende il contesto e perché gli attacchi mostrati dimostrano poco. - [Una extension Swift per String e HTML](https://www.sofapps.it/it/blog/swift-string-html-extension/index.md): Convertire stringhe HTML in NSAttributedString con una extension nativa di String, impostare font, dimensione e colore via CSS e leggere i document attributes. - [iPhone X e la visione periferica](https://www.sofapps.it/it/blog/iphone-x-peripheral-vision/index.md): Come la Safe Area di iPhone X e la visione periferica guidano il layout di un'app: zone dello schermo, margini in landscape e proporzioni rispetto a iPhone 8. ## About - [Home](https://www.sofapps.it/index.md): what Sofapps makes, principles, consulting, contact - [Podcast Il Morso](https://www.ilmorso.it/): weekly Italian podcast about the Apple world, hosted by Costantino Pistagna - [Privacy](https://www.sofapps.it/privacy/index.md) ## Optional - [All articles, full text](https://www.sofapps.it/llms-full.txt) - [Atom feed, English](https://www.sofapps.it/feed.xml) - [Feed Atom, italiano](https://www.sofapps.it/it/feed.xml)