• On your iPhone: every pass worked out thereA-01
  • Data Not CollectedA-20
  • one download, only when you tapA-10
  • iPhone, iOS 26 or laterA-05

See when satellites cross your sky, and where to look.

It works out when satellites pass over you, where to look, and for how long.A-50 It does the sums on your iPhone, and your location stays there.A-01A-22A-23

Coming soon to the App Store.A-100

SARAMAGO's pass across the sky, 15 July 2026 A disc for the sky above 40° N, 75° W: straight up in the middle, the horizon at the edge, north at the top and east to the right. The satellite rises at 3:45 AM low in the north-north-east, climbs to 48° in the east at 3:50 AM, and sets in the south at 3:56 AM. 30°60° NE SW Rise 3:45 AMlow, north-north-east Highest 3:50 AM48° up, in the east Set 3:56 AMin the south
SARAMAGO, the first satellite numbered 100000, over 40° N, 75° W on 15 July 2026, in local time (EDT). Its real track, every 10 seconds, about eleven and a half minutes above the horizon.G-10E-03E-06E-08
GP Passes showing the Space Station: its catalog number as a TLE carries it, and the next pass, with when it can be seen, the time until it rises, and its rise, highest point and set. One Space Station pass in GP Passes: its path on a sky plot, the Doppler curve, and the frequency to tune to for 437.800 MHz, minute by minute.
The Space Station in GP Passes 1.0. Data: CelesTrak, recorded 21 September 2026.

The app

In your pocket

  • The next pass, firstIn Plain mode, in everyday words; every figure in Detailed.A-50
  • A Doppler card on every passWhat to tune to, through the pass, as a table you can follow.A-40A-41
  • A reminder before it risesA notification from your iPhone, 1 to 30 minutes ahead. Nothing is sent anywhere.A-30A-31

How it works

From data to your sky

One real pass, followed all the way: SARAMAGO's, over 40° N, 75° W.E-03

  1. 1 A0000U 26067CY  26195.90649229  .00004770
      00000+0  22159-3 0  9994
    2 A0000  97.4593 154.0970 0005590
      270.5113  89.5482 15.2046728115911

    An element set

    The orbit as numbers, measured at one moment: the catalog number, the epoch, how fast it goes round.E-01E-02

  2. SGP4

    Runs the set forward in time: where the satellite is, at any moment. On your phone, with GPKit.A-01K-30

    • Rise3:45 AM0°, NNE
    • Highest3:50 AM48°, E
    • Set3:56 AM0°, S

    The pass

    When it clears your horizon, its highest point, and when it goes back below.E-03E-06

  3. Your sky

    Where to look: face north-north-east at 3:45 AM, and look low.E-03A-19

Who it's for

To see one, to hear one, or to start

One download, when you tap

To work out passes, the app needs each satellite's orbit, called an element set. It gets them from CelesTrak, a free service, in one request, and only when you tap Download.A-10 It won't ask again for two hours.A-25 That request carries nothing about you: no location, no account, and no device ID.A-27

How a pass prediction works → · Privacy →

Coming next

Tonight's passes, a clear-sky check and smart alerts are planned for 1.1. Point me there, which turns your phone towards a pass, is planned for 1.2, and more satellite groups, event cards and an observation log for 1.3. None of them is in 1.0.A-70A-71A-72A-73A-79A-83A-84A-85

What's coming →

Built on GPKit

The orbit sums come from GPKit, an open-source Swift library for satellite data, tested with gpconf.A-03A-04K-07K-82 GPKit →

Go deeper: what runs where

Requirements: iPhone, iOS 26 or later.A-05

Sources

  1. A-10 The app downloads https://celestrak.org/NORAD/elements/gp.php?GROUP=amateur&FORMAT=CSV, and only when you tap Download. Source: Passes: PassesCore/Download.swift:34; PassesUI/AppModel.swift:438-440 ("Nothing else in the app calls this"); callers SatelliteListView.swift:185-187.
  2. A-25 At most one request every two hours. The attempt is counted before it is sent, and there are no retries. Source: Passes: Download.swift:146-161; DataSource.swift:98.
  3. A-27 The request is a GET with User-Agent GPPasses/<version> (+https://github.com/hneogy/GPKit; honorius@neogy.dev; one group, on the user's tap, at most once in two hours), Accept: */*, Accept-Language: en and no cookies. It sends no location, account or device ID. A test checks the request on the wire. Source: Passes: Download.swift:50-64; NetworkTransport.swift:11-47 (ephemeral session, no redirects); Tests/PassesUITests/RequestOnTheWireTests.swift.
  4. A-70 1.1, 1.2 ("Point me there") and 1.3 ("More sky") are built after 1.0 and merged into the app's main branch, not released; none of their features is in 1.0 (on 2026-11-10, 1.0 was in Apple's review). Source: Passes: PR #42 "GP Passes 1.1", #43 "GP Passes 1.2: Point me there", #44 "1.3, More sky" (merged 2026-11-09 and 2026-11-10; each body: "Nothing ships from this: 1.0 is in Apple's review"); Passes.xcodeproj/project.pbxproj at ca62db3: MARKETING_VERSION = 1.0 in all six configurations.
  5. A-71 1.1, Tonight: a card at the head of the next passes with tonight's passes that can be seen, the soonest first; the night runs from the sun going more than 6° below the horizon to its coming back above that. Source: Passes main ca62db3 (2026-11-10): Modules/Sources/PassesCore/Tonight.swift:3-7; commit 23c544a.
  6. A-72 1.1, the clear-sky check: for a pass that can be seen, the forecast cloud cover in a word (Likely clear, Partly cloudy, Cloudy), from Apple Weather; off until turned on in Settings; while on, the location rounded to about 10 km is sent to Apple Weather; off, nothing is sent. Source: Passes main ca62db3 (2026-11-10): PassesCore/Clouds.swift:31-38, :57-58 (the switch and its note, app text); PassesCore/ObserverLocation.swift:391-392 (off unless set); Modules/Tests/PassesCoreTests/CloudsTests.swift:81; commit 6f8d0d7.
  7. A-73 1.1, smart alerts: "Only passes I can see", a switch beside the alerts for every pass; alerts come only for passes that can be seen and, with the clear-sky check on and where the forecast reaches, only those likely clear. Source: Passes main ca62db3 (2026-11-10): PassesCore/PassAlerts.swift:152-157 (app text); commit ad12927.
  8. A-79 1.2, Point me there: which way to turn and tilt the phone to where a pass rises or the satellite is, as an arrow and taps that quicken as it comes near; worked out on the phone from the element set and the phone's motion sensors; nothing is sent. Source: Passes main ca62db3 (2026-11-10): PassesCore/Pointing.swift:4-8; commit 1f7e416.
  9. A-83 1.3, more groups: Space stations, Brightest, Amateur radio, Weather, CubeSats and Starlink, chosen when Download is tapped; each asked for only on that tap, at most once in two hours, each group counted apart. Source: Passes main ca62db3 (2026-11-10): PassesCore/Download.swift:10-12, :30-36, :56-63; commit a52947c; PR #44.
  10. A-84 1.3, event cards on the Sky tab: a Starlink train (ten or more satellites of one launch still flying close together) and craft at the ISS or Tiangong; worked out on the phone from the files it holds, never fetched; every card says which file its facts come from. Source: Passes main ca62db3 (2026-11-10): PassesCore/EventCards.swift:4-13, :18-32; commit 2795c7d.
  11. A-85 1.3, the observation log: a pass marked as seen, with a note, kept on the iPhone and sent nowhere, listed by night from the Sky tab with how many passes were seen and the nights in a row; one sighting or the whole log can be deleted. Source: Passes main ca62db3 (2026-11-10): PassesCore/ObservationLog.swift:3, :114-119 (app text), :164-170, :174, :210-213; commit e6521d5.
  12. A-03 The app is built on GPKit 1.0.0, pinned to revision 01545c6. Source: Passes: Modules/Package.swift:20; Modules/Package.resolved.
  13. A-04 Settings → About shows "Orbits: GPKit 1.0.0 (SGP4)". Source: Passes: Modules/Sources/PassesUI/SettingsScreen.swift:127.
  14. K-07 Licence MIT, © 2026 NEOGY LLC. Source: GPKit: LICENSE:1-3.
  15. K-82 CI runs gpconf's 5 offline cases; 13 need provider files that gpconf fetches and does not ship. Source: GPKit: README.md:153-155; ci.yml:33-56; tools/check_gpconf.py.
  16. A-01 Passes are worked out on the phone, from element sets, using GPKit's SGP4. Source: Passes: Modules/Sources/PassesCore/Passes.swift:116-129; Modules/Package.swift:24-25.
  17. A-15 Sky categories: daylight (sun above 0°), twilight (0 to −6°), dark. Earth's shadow is a cylinder of radius 6378.137 km. The sun's position follows NOAA/Meeus. Passes are sampled every 10 s (at most 240 samples) and changes refined to the second. Source: Passes: Sun.swift:7-18,101-136,215-249.
  18. A-30 Reminders are local notifications. The pass screen says under the button: "A notification from this device at the time chosen. Nothing is sent anywhere.". Source: Passes: ReminderCenter.swift:20,42,78-84; PassDetailView.swift:920.
  19. A-36 There is no push server for Live Activities. Source: Passes: LiveActivityCenter.swift:12-17.
  20. A-38 The widget computes passes itself from app-group data, fetches nothing, and looks 2 days ahead for up to 25 starred satellites. Source: Passes: NextPassWidget.swift:17-18; Shared.swift:91,205.
  21. A-28 The Map tab is Apple's map, which Apple supplies for whatever area is on screen. Source: Passes: SettingsScreen.swift:142.
  22. A-29 No analytics, no crash or tracking SDKs. GPKit is the only package dependency. Source: Passes: Modules/Package.resolved; docs/audit-2026-10/VALIDATION.md:3-4.
  23. A-20 The privacy manifest declares no tracking, no tracking domains and no collected data types, plus UserDefaults access (reason CA92.1). The same applies to the app and the widget. Source: Passes: Passes/PrivacyInfo.xcprivacy:5-21; PassesWidgets/PrivacyInfo.xcprivacy:5-21; test PrivacyManifestTests.swift:16-34.
  24. A-05 iPhone only, iOS 26 or later. Source: Passes: project.pbxproj:374,470; TESTFLIGHT.md:19.
  25. A-100 GP Passes 1.0 is in Apple's review: submitted, not yet approved, so not yet on the App Store (the site says "Coming soon to the App Store", with no link). Source: the owner's statement (R-20, 2026-11-10); App Store Connect not seen by a session; the Passes repository records the TestFlight uploads (TESTFLIGHT.md:127-129) and no submission.
  26. A-50 Plain vs Detailed: the labels, the two notes, default Detailed, and the first-run question "Have you watched satellites before?". Source: Passes: DisplayMode.swift:9-21,47-55; ObserverLocation.swift:340-342.
  27. A-22 The location permission text reads: "Your location is used on this device to work out when satellites pass over you. This app does not send it anywhere.". Source: Passes: project.pbxproj:454.
  28. A-23 Location is stored on the device (UserDefaults and the app group, so the widget can use it). Source: Passes: ObserverLocation.swift:4,205-217; Shared.swift:78.
  29. G-10 On 11 July 2026 the catalog assigned number 100000, to SARAMAGO. Source: gpconf: README.md:98-99; docs/BRAND.md:59.
  30. E-03 Over 40.0° N, 75.0° W (100 m), from 2026-07-14T21:45 UTC for two days, Skyfield 1.55 gives a SARAMAGO pass: rise 2026-07-15 07:45:08 UTC at az 17.5°; culmination 07:50:55 UTC, el 48.21°, az 99.4°, range 667.9 km; set 07:56:37 UTC at az 181.1°. Source: GPKit: Tests/GPKitTests/Resources/skyfield-passes.json (set "SARAMAGO"), written by tools/skyfield_passes_reference.py.
  31. E-06 Local time at the example place: US Eastern Daylight Time (UTC−4) on 14–15 July 2026, so rise 03:45:08, highest 03:50:55, set 03:56:37, epoch 17:45. Source: IANA time zone America/New_York through Python's zoneinfo, run 2026-10-31.
  32. E-08 The example pass's track for the sky view: azimuth and elevation every 10 s from rise to set, 70 points; its events reproduce E-03 (rise 07:45:08.5 UTC at 17.49°, highest 07:50:54.7 at 48.21°, 99.4°, 667.9 km; set 07:56:36.7 at 181.08°). Source: tools/sky_track.py, Skyfield 1.55 (the corpus's .venv), E-01's lines, offline; output sites/passes/data/saramago-track.json.
  33. A-40 Doppler: you type a frequency (1 to 100000 MHz) and choose downlink or uplink; it gives "Tune the receiver to" or "Tune the transmitter to". Source: Passes: Doppler.swift:4-23; PassDetailView.swift:646,657.
  34. A-41 The Doppler table gives about 10 rows at round clock times, plus rise, highest point and set. Source: Passes: Doppler.swift:105-130.
  35. A-31 Reminder lead times are 1, 5, 10, 15 or 30 min, default 10. Source: Passes: Reminder.swift:22; ObserverLocation.swift:437-443.
  36. E-01 SARAMAGO's first published element set, as a TLE rendered by gpconf from CelesTrak's OMM (gp-first.php?CATNR=100000&FORMAT=CSV, retrieved 2026-09-21T00:43:55Z), because CelesTrak serves no TLE above 99999. Source: gpconf: derived/alpha5-tle/alpha5-A-100000-saramago-first.tle and .provenance.json; the same lines in GPKit Tests/GPKitTests/Resources/pass-check-sets.tle (NOTICE:56-61, from gpconf at bec466b).
  37. E-02 The field reading of that TLE: designator 26067CY; epoch day 195.90649229 of 2026 = 14 July 2026 21:45 UTC; B* 0.22159e-3; inclination 97.4593°; eccentricity 0.0005590; mean motion 15.20467281 rev/day, so a period of about 94.7 min (1440 / 15.20467281 = 94.707). Source: the line itself; the field layout as GPKit reads it (TLE.swift); the arithmetic shown.
  38. K-30 SGP4 is a port of Vallado's SGP4.cpp (CelesTrak/fundamentals-of-astrodynamics 49df0479c950), with names and order of operations kept. Source: GPKit: NOTICE:9-17; SGP4Core.swift:1-15.
  39. A-19 Directions use a 16-point compass. The sky view has the zenith at the centre and north up. Source: Passes: Display.swift:21-23; Passes.swift:186-196.
  40. A-51 The six lessons and their titles, in order. Source: Passes: PassesCore/Lessons.swift:13,84-135.
  41. A-14 "Can be seen" means the satellite is in sunlight while your sky is dark (sun more than 6° below the horizon). Source: Passes: PassesCore/Sun.swift:14-15,145-147,268.
  42. A-53 The guided watch moves from Before to During to After; VoiceOver announces at most every 30 s. Source: Passes: GuidedWatch.swift:3-166.