Native Design

TL;DR

Inspired by Radio Garden, I built Atlas FM as an iOS app experiment in spatial radio discovery, using a globe to tune into live stations around the world. Most of the work lived in the feel: Drift mode, song saving, Taste Memory, haptics, audio handoffs, micro-animations, and all the small details that make a product feel considered instead of assembled.

Atlas FM

Atlas FM: Explore the world by radio

Radio Garden was the obvious inspiration. It did something rare: it made radio feel like geography again. Instead of searching for a station name, you could move around the world and listen by place.

That idea stayed with me, and I kept wondering what this kind of experience could feel like if every part of it was treated as an iPhone interaction problem: the globe movement, the player reveal, the station handoff, the haptics, the saved songs, the moments where a stream fails, and the way metadata arrives late or not at all.

iPhone Frame

Radio Garden proved the feeling

Radio Garden showed that the best interface for world radio might not be a list, but the world. The globe, the distance, the feeling of moving from one place to another, all of that makes station discovery emotional before it becomes functional.

I didn't invent globe radio, and Atlas FM starts with that influence openly. The premise is shared, but my obsession was how it should feel on an iPhone.

For me, the interesting part isn't a simple web-versus-native argument, and Radio Garden has a Radio Garden Live App Store listing. Atlas FM is a study of the same powerful feeling through a different lens: a designer-built iOS app where motion, haptics, failure states, and audio behavior are all part of the product.


Native feel isn't a skin

Native doesn't just mean SwiftUI controls or iOS-looking surfaces. The bar is higher than that: transitions need to be interruptible, haptics need to confirm intent, background audio has to behave, motion needs weight, and every state still has to be readable while the app is already moving.

Atlas FM started as a craft question. What happens if the globe movement, station switching, compact player, expanded player, saved songs, and error recovery are treated as one continuous interaction system?

Native polish isn't decoration, it's the difference between looking at an idea and trusting it in your hand.


The globe is still the interface

Atlas FM starts from the globe, not a station directory. Pins aren't just markers, they're the navigation model for tuning by place: city, coast, island, border, region.

Search and filters still exist because real products need ways back in. But they support exploration instead of replacing it. The app should help you find a path without flattening the world into rows.

I wasn't trying to make radio more efficient, I wanted to keep it tied to place.

iPhone Frame

Drift mode as a moving dial

Drift is the feature that made Atlas FM feel like its own product. It's hands-free world radio, but not just shuffle. The user controls how long to stay on each station, and how far the next jump should feel.

A drift can stay close, moving through nearby cities and regions, or it can widen, crossing countries, languages, and time zones. The globe moves between stations, the camera finds the next place, and static fills the handoff so the transition feels like tuning instead of loading.

Drift is what happens when the globe becomes the dial.

iPhone Frame

The small confirmations

Favorite station heart animations, saved song stars, player artwork that moves instead of teleporting, text transitions for changing station and song metadata, haptics on station changes, saves, and controls, static during handoff, local time and region presentation in Drift, and compact player gestures that carry into the expanded player.

None of these moments are the feature on their own, but together they tell the user the app is still with them, even when the stream changes, the metadata is late, or the globe moves somewhere new.

iPhone Frame

The player had to listen

The expanded player has equalizer bars that move with the music. On paper that sounds like a visual flourish, but it only works if it feels believable. Drawing bars is easy, making them feel attached to live audio is much harder.

Raw audio energy isn't a normal animation. It spikes, clips, disappears during silence, changes wildly between stations, and behaves differently when a stream is buffering or switching. If the bars follow every sample too literally, they jitter. If they are smoothed too much, they become a fake screensaver. Getting it right means translating the signal: sampling, normalizing, damping, decay timing, and deciding how much truth the interface can show without looking broken.

Live radio makes that stranger because there is no clean song file with predictable levels. There's a stream. Sometimes music, sometimes speech, sometimes silence, sometimes a handoff between two completely different sources. The equalizer has to survive all of that and still feel attached to what you hear.

I wanted the player to feel like it was actually listening, not just running an animation.

iPhone Frame

Live radio is messy

Streams fail, metadata arrives late, some stations have no artwork, some songs can't be identified, and station data is inconsistent. Live radio is a beautiful system because it's alive, and alive systems are rarely tidy.

Atlas FM handles that mess with broken-stream skipping, ignored stations, fallback metadata, loading states, and careful transitions. I don't want to pretend the system is clean, I want to keep every rough edge from becoming the user's problem.

Polish isn't pretending the system is clean, it's making the mess feel survivable.


Saving places and songs

Favorite stations and favorite songs are different kinds of memory: a station is a place to return to, while a song is a trace of what you found there.

Atlas FM keeps that distinction visible. Saving a station says, I want to go back there, while saving a song says, I want to remember what I heard there. Songs can be opened later in music apps, but the larger idea is simpler than integration: discovery leaves a trail.

The app separates "I want to go back there" from "I want to remember what I heard there."


Taste Memory without killing discovery

Taste Memory learns from play, save, skip, and ignore behavior. It helps recommendations and automated choices, especially in Drift, but it shouldn't turn Atlas FM into a feed.

The danger of personalization is that it makes the world smaller. Atlas FM tries to make wandering more comfortable without making it predictable. The system should learn enough to avoid obvious wrong turns, but not so much that every path leads back to the same taste.


A designer without an engineer

Atlas FM also tested how much production behavior I could own as a designer without an engineer on the project. I wasn't just drawing the interface or producing a clickable prototype, I was tuning real behavior on device until it could be felt.

What I cared about was being close enough to the product to judge timing, haptics, failure states, language, motion, and restraint directly. The last stretch wasn't getting the app to run, but making it feel like the right version of the idea.

Getting the app to run was only the beginning, and making it feel like the right version of the idea took much longer.


Closing

For Atlas FM to feel right, the globe had to stay the instrument, not just the visual.

Most of the work was in tuning the gaps between actions: how a station starts, how the globe moves, how a song is saved, how static fills silence, and how the app recovers when live radio behaves like live radio.

Once the globe became the instrument, the rest of the product started to make sense.