Case study

Cloudtape

An offline-first iPhone music player. It mirrors the Dropbox folders you pick to your phone and plays everything from local disk.

Role
iOS music player
Year
2026
Engagement
Independent
iosreact-nativeexpodropboxmusicoffline-first

Your Dropbox music, on your phone.

You pick folders in Dropbox, it mirrors them to the phone in the background, and every song plays from local disk. Nothing streams, so nothing buffers, and listening uses no data. The way I think about it: the native Music app, done properly, for music that lives in Dropbox.

It costs $2.99, once. The download is free with a 14-day trial, and the trial starts at your first successful sync, not at install. After that it's a one-time Lifetime Unlock with Family Sharing on. No subscription. If the trial runs out, syncing stops but playback doesn't. Everything already on the phone keeps playing.

There's no Cloudtape account and no server. The app has no analytics, its App Store privacy label is "Data Not Collected", and it only ever reads from Dropbox.

Highlights

  • Syncs only what you pick — Choose the folders and Cloudtape keeps them mirrored in the background.
  • Follows moves and renames — Reorganize folders in Dropbox and it notices, instead of downloading everything again.
  • Plays what you've got — MP3, AAC, M4A, ALAC, FLAC, WAV and AIFF, plus M4B audiobooks.
  • A library like the Music app — Albums, artists and songs. Music already on the iPhone shows up in the same library.
  • Picks up where you left off — Long DJ sets and audiobooks resume per file.
  • Waveform scrubber — The seek bar is drawn from the track's own waveform.
  • The small stuff — Playlists, embedded lyrics, a sleep timer, ReplayGain volume levelling, and Last.fm scrobbling that counts offline plays too.

How it's built

It's Expo SDK 57 on a dev client, React Native 0.86 and TypeScript, with expo-router for navigation. The library lives in SQLite (expo-sqlite with Drizzle) and playback runs on expo-audio.

Where Expo didn't reach, I wrote native Swift modules. One handles purchases with StoreKit 2 directly, no RevenueCat. One reads the music already on the phone through MPMediaLibrary. One reads audio with AVAssetReader to draw the waveforms.

Downloads run as iOS background downloads, so a big sync carries on while the app is suspended. The catch: Dropbox's normal download endpoint takes its arguments in a request header, and iOS background sessions can't send one. So Cloudtape asks Dropbox for a temporary link to each file and hands iOS that instead.

I worked the design out as static HTML mocks before writing any React Native: a white ground, one soft purple (#6F5D9E), Instrument Sans, and lowercase display type.

Status

Cloudtape went to App Review on September 21, 2026. I'll add the App Store link here once it's approved. Until then, the website has everything.

Role

Design, iOS build and marketing site. Released under Believe Labs, LLC in San Francisco.

The screenshots use a demo library. The bands, albums and audio are invented, and the cover photos are from Unsplash (Daniel Genser, Cristian Moscoso, Laurice Solomon, Barcelona, Johnny Lam and Kundan Ramisetti).

Website: cloudtape.believelabs.com

More work

Show all work
Available for consulting

Have something to build?

I'm available for contract work — hourly, fractional, or project-based. Tell me what you're working on — I reply within a day or two.