Project / iOS Native SwiftUI, offline by design
The Sunfall app icon, a pale sun low over a dark horizon.

iPhone / Photo & Video

Sunfall

Sunfall tells you when the good light happens where you are, where on the horizon it will come from, and what the moon is doing once the sun has gone. Every time is computed on the phone. There is no account, no server, and nothing to sign in to.

Download on the App Store

Available now. $4.99 USD, paid once. No subscription or in-app purchases. For iPhone with iOS 17 or later.

Visit sunfall.app Read the launch announcement ↗ Read how it was built in 24 hours ↗
Idea to finished build
24 h
Network calls at rest
0
Solar values checked
588
Lunar values checked
8,190

01 / The app

One screen that answers the question.

iPhone 17 Pro · iOS 26

Most sun apps make you assemble the answer from a table. Sunfall opens on what the light is doing right now, what happens next, and how far away it is.

Sunfall's main screen for San Francisco. A large heading reads next, 6:55 PM, golden hour begins. Below it a dark sky ribbon shows the sun's arc in cream and the moon's in blue against warm and blue vertical bands, then sunrise and sunset times with their compass bearings, and an expanded moon card.
The sky ribbon A rolling 24 hour window centred on now, not a chart of today. The sun's arc runs into the moon's, and the sky color behind them is keyed to the sun's altitude at each moment, so golden hour is a band you can see rather than a number you look up. Drag it sideways to move through time. It is centred on now for a reason: the moon's arc straddles midnight, and a day view chops a moonlit night into two fragments.
Platform
iPhone, iOS 17 and later
Built with
Swift and SwiftUI, no third party code
Works offline
Everything except searching a place by name
Price
$4.99 USD once, no in-app purchases
The same main screen with the moon card collapsed, showing waning crescent, 13 percent lit, rises 2:37 AM, sets 5:40 PM, followed by blue hour and golden hour rows.
Sun and moon together Altitude, bearing, phase, percent lit, rise and set. If you are shooting the Milky Way you want a new moon; if you are shooting a landscape at night you want a full one high overhead.
A golden hour row expanded in place to reveal a definition, followed by a camera icon and a note explaining that the low angle throws long soft shadows.
Every term explains itself Tap any row and it opens in place, so the times stay on screen. Each definition has two halves: what the thing is, then what it means behind a camera.
A full day timeline listing astronomical dawn, nautical dawn, blue hour, golden hour, sunrise, solar noon, sunset, blue hour, nautical dusk and astronomical dusk with times.
The whole day, in order Civil, nautical and astronomical twilight either side of the light windows, for the nights you are chasing real darkness rather than a nice sunset.

02 / Scope

Small on purpose.

Sunfall answers one question well rather than ten questions badly. There is no feed, no social layer, no subscription and no onboarding carousel.

  • Light windowsGolden hour and blue hour, morning and evening, with durations.
  • BearingsSunrise and sunset compass bearings, so you know which way to point the camera, not only when.
  • The moonAltitude, bearing, phase, percent lit, moonrise and moonset.
  • TwilightCivil, nautical and astronomical, at both ends of the day.
  • Any dateStep forward or back to plan a shoot, or drag the sky to scrub through time.
  • Any placeSearch a city, save it, and see its light in its own local time.
  • One reminderOptional, thirty minutes before evening golden hour. Nothing else ever notifies you.

03 / Constraint

It works in a canyon with no bars.

The places worth photographing are usually the places with no signal, so the app was built to need none. Sun and moon positions are astronomy, not data: given a time and a coordinate, the answer is computable on the device in a millisecond. Nothing is fetched, so nothing can fail to arrive.

That constraint decided the privacy story too, rather than the other way around. There is no Sunfall server to send a location to, no account, no analytics and no third party code in the app at all. The one network call Sunfall can make is the place search you type yourself, which Apple's geocoder answers. Saved places keep working offline afterwards.

The privacy policy says the same thing in more words.

04 / Correctness

An app like this is only worth having if it is right.

A sun app that is quietly twenty minutes out is worse than no sun app, because you will believe it and miss the light. So the engines were treated as the product and checked against references that were written by other people.

How each engine was validated before shipping
EngineChecked againstAgreementValues
Sun, NOAA algorithmastral, ten cities from the equator to Anchoragewithin 2.2 minn/a
Sun, Swift portthe validated Python referencebit for bit588
Moon, Meeus ch. 47 and 48Skyfield against the JPL DE421 ephemeris0.014° altitude, 0.054° azimuthn/a
Moon, Swift portthe validated Python referencebyte identical8,190

Those numbers are now golden master tests, so a refactor that moves any of them fails the build. Sunfall also reports honestly at the edges: north of the Arctic Circle in midwinter it will tell you the sun does not rise, rather than inventing a sunrise to fill the field.

05 / Process

Built in a day, on purpose.

Sunfall exists because I wanted to learn the whole iOS pipeline end to end, from an empty folder to a signed build sitting in App Store Connect, and the fastest way to learn a pipeline is to push something real through it. Market share was never the goal. Finishing was.

The interesting part was not the SwiftUI. It was the three bugs that only turned up when the numbers were checked against something independent, the fourth that only turned up by opening the app after dark, and the one step in the whole chain that cannot be automated at all.

Read the build notes