Icon

Smmall Cloud for iOS

Author imagePublished on Apr 1, 2026 by

Levi

I've been wanting to build a native iOS app for Smmall Cloud for a long time. The web app works fine on mobile, but "works fine" isn't the same as "feels right." Uploading a photo from your camera roll shouldn't involve opening Safari, logging in, and navigating to an upload page. It should be a tap. Maybe two.

So I built the thing. Smmall Cloud is now on the App Store.

What it does

The app gives you everything you'd expect from the web version, but designed around how people actually use their phones:

How I built it

The whole app is SwiftUI. As a long-time objective-c developer this was an interesting experience but I wanted to push myself to adopt this newer tech for the mobile app. I resisted the temptation to reach for UIKit except where Apple forces your hand (share extensions, the Messages extension). Even then, I wrapped everything in UIHostingController to keep the UI layer consistent.

The architecture is MVVM using Swift's @Observable macro. If you haven't used @Observable yet, it's a massive improvement over ObservableObject and @Published. Less boilerplate, fewer weird edge cases with view updates. Every view model is @MainActor and the global app state lives in an AppState object that gets injected through the environment. A weird shift from using singletons in obj-c but I think it's an improvment.

For the first time in an app I've built, there are no third-party dependencies at all. The whole app is built on Apple frameworks. StoreKit for subscriptions, PhotosUI for the photo picker, AVKit for media playback, PDFKit for PDFs, Charts for the analytics graphs. I didn't even need a custom image cache library — I wrote a simple one that does exactly what I need and nothing more.

The upload system

This is the part I'm proudest of. Uploading files from a phone is tricky because connections are unreliable and users background the app constantly. Here's how it works:

Getting all of this to work reliably with iOS's background execution limits was... an adventure. But the result is that you can start uploading a huge video, switch to another app, and come back to find it done.

Extensions everywhere

One of the things I love about iOS development is how deeply you can integrate with the system. It seems like every time I check Apple has added a new way to integrate.

The app ships with four extensions:

  1. Share Extension: Upload files from any app's share sheet
  2. Messages Extension: Browse and share files inside iMessage
  3. Action Extension: Upload and copy a share link in one step
  4. Live Activity: Upload progress in Dynamic Island and on the lock screen

All the extensions share data through an App Group container and a shared Keychain access group, so you're always authenticated and your uploads always go to the right profile.

What I learned

SwiftUI has come a long way but it still has rough edges: custom navigation transitions, keyboard avoidance, and share extensions all required more workarounds than I'd like. But the end result is an app that feels like it belongs on your phone in a way that a web app wrapper never would.

If you're already using Smmall Cloud, go grab the app. If you're not, maybe this is a good reason to start.

Sheesh, I'm already finding bugs with 1.0. 1.1 is on the way.

Happy sharing!

Related Articles