I spent the first phase of my Shipaton build getting a weather satellite pipeline to work. It worked. Then I looked at what it produced and cut it from the core of the app.Amana is an iOS app with one job: put the sky that is outside your window onto your screen, make it good enough that you want to see the real thing, and get you out the door. The premise only survives if the sky on screen is beautiful. So the first question was where that image comes from. The obvious answer was a satellite Himawari, Japan's geostationary weather satellite, images the full disk every ten minutes. The data is public. My Phase 0 pipeline pulled raw bands from NOAA's AWS Open Data mirror, composited a true-colour image with satpy, cropped to a region, graded it, and cached the result. It ran. The Earth came out round and blue and, honestly, gorgeous. It was also completely wrong for my app, and it took looking at the output on a clear day to see why. Satellites look down A weather satellite sees cloud tops and the ground. That is the entire job. On a perfectly clear day over Japan, the true-colour composite of my location is a dark navy ocean — because that is what is underneath the clear air, and clear air is transparent from above. A blue sky is not a thing you can photograph from orbit. Blue sky is what the atmosphere looks like from inside it, scattering sunlight toward an observer standing on the ground. The satellite is on the wrong side of the phenomenon. Sunset is the same story: the colours a person sees at dusk come from a long, low path through the atmosphere toward their eyes. From above, the satellite does not share the observer’s geometry. This is obvious once stated. It was not obvious while I was debugging band alignment and getting a composite to render. The lesson, stated plainly "Can I get this data?" and "does this data show what my user wants to see?" are different questions, and success on the first one feels exactly like progress on the second. Everything about my pipeline reported success. The downloads completed. The composite rendered. Nothing in my logs, my tests, or my build could have told me the picture was wrong, because by every technical measure it was right. Only looking at the image against the intent caught it. I hit the same class of failure again later, in a smaller way: those satellite servers return HTTP 200 even when a tile fails, with a fully transparent PNG that decodes without error. The image is empty and every layer of the stack agrees it is fine. Once you have been burned by output that is technically valid and semantically wrong, you start checking the meaning of the result, not just its status code. What replaced it: rendering the sky instead of fetching it If you cannot photograph the sky from above, compute it from where the user actually is. The core of Amana became a physically-based procedural sky rendered on the device, driven by the user's current time, location and the solar elevation that follows from them. Two paths, one shipped and one held in reserve: MDLSkyCubeTexture from Apple's Model I/O. It is in the SDK, it costs nothing, and it takes four parameters: turbidity, sun elevation (0.5 is the horizon), upper-atmosphere scattering (drive it to 0 for sunset colours) and ground albedo. Feed it a real sun position and you get real blue-to-amber transitions. Hillaire 2020, the LUT-based atmosphere model behind Unreal's SkyAtmosphere, for the higher ceiling. It is mobile-viable, but the reference implementations are GLSL, so shipping it means porting to Metal. One trap worth flagging for anyone following this path: SceneKit was soft-deprecated at WWDC25. If you are reaching for it because every sky-rendering tutorial from the last decade uses it, don't. Metal, SwiftUI shaders or RealityKit. The second trap: these are clear-sky models Both atmosphere models produce a beautiful, cloudless sky. Always. A cloudless sky is not "the sky outside your window" on most days of the year, and an app that shows perfect weather during a storm is a liar. So the real sky is two layers: the procedural atmosphere underneath, and cloud cover from WeatherKit composited on top. The precedent here is Not Boring Weather, which was an Apple Design Award finalist for doing procedural weather driven by live conditions — proof the approach can carry a design-led app, not just a tech demo. This also fixed the offline story, which the satellite version never had. The atmosphere is computed on-device, so the clear sky renders with no network at all. Losing connectivity degrades the cloud layer to the last cached cover instead of taking the whole screen down. The satellite work was demoted, not deleted Here is the part I would tell my past self. The pipeline was wrong as the core and still valuable as a counterpoint. The satellite shows something the ground-level sky cannot: the shape of the weather you are standing under. So it stayed in the app as the contrast view. Pull the porthole upward and the disc holding your local sky morphs into the planet — the same moment, seen from the other side. Both views are driven by the same clock and the same weather, so they agree with each other. Circles and wide maps are different shapes, so the naive version of that transition gives you a circle with black bars. Everything is unified under one interpolated RoundedRectangle — cornerRadius = side / 2 for the circular case — so circle, map and zoom all morph off a single continuous value and the shape never breaks mid-gesture. It lasts about four tenths of a second and it is the piece of the app I spent the most time on. A licensing note, since this is the kind of detail that is annoying to discover late: for commercial use I take the satellite imagery from the Japan Meteorological Agency's public true-colour product rather than research channels, and the app credits three organisations on screen. Check the terms of your imagery source before you build a feature on it, not after. What I would take from this Validate the output against the intent, not the pipeline against itself. Every green check I had was measuring whether the code ran. A technically valid result can be semantically wrong, and that failure mode logs nothing. Those are the expensive ones. Prefer computing over fetching when the thing you want is a function of the user's position in the world. It removed a backend dependency, made the core work offline, and made the image correct for the first time. Demote before you delete. The discarded core became the app's signature moment. Amana shipped on the App Store on 6 August 2026 and is free: https://apps.apple.com/jp/app/id6790911086
Why We Abandoned Satellite Imagery for an On-Device Procedural Sky
Full Article
Original Source
Read the full article at Hackernoon →KhanList aggregates and links to publicly available news content. We do not host full articles from third-party sources. Always verify important information with original sources.