Ephemeris app icon

ih-FEM-uh-riss: read last night's PHD2 guide log, then see what your rig has done all season

Free · GPLv3 · Requires macOS 15 Sequoia or later

View release notes on GitHub

Combining a full night of guide sessions, gaps preserved.

Ephemeris is a Mac-native viewer for PHD2 guide logs, the text files PHD2 writes during every autoguiding session. The name comes from astronomy: an ephemeris, from the Greek for "daily," is a table of celestial positions recorded over time. That's what a single guide log is, frame by frame, all night. It's also what a season of them becomes.

Open one log and Ephemeris charts RA and Dec error, plots your calibration cross, and runs FFT analysis to find periodic error. Import a folder of them and it builds a library, organized per rig, with trends that only exist across nights. It reads that history against your actual imaging scale and tells you what it notices, and it always says whether an observation comes from PHD2's own documentation or from Ephemeris itself.

Free, GPLv3, written in Swift and SwiftUI, and a Mac-native re-implementation of Andy Galasso's phdlogview, the canonical PHD2 log viewer, written and maintained by the same engineer who maintains PHD2 itself. I built it because Rosetta is going away and the Mac side of this hobby is thin. A good native tool felt like a worthwhile thing to contribute. The larger goal was always v2: give the app enough understanding of your rig to point at what your guiding is actually doing and suggest what to try next, so guiding stops feeling like a black box you poke at between clear nights.

Every Session at a Glance

What does my whole night of guiding actually look like?

If you image for more than an hour or two, you don't have one guide log per night — you have fifteen. Meridian flips, dither pauses, settling resets, the time PHD2 lost the star and you didn't notice for ten minutes. Ephemeris reads the whole file at once and gives you every guiding and calibration section in chronological order, with RMS RA, RMS Dec, total RMS, and a quality bar that tells you instantly which sessions held up and which fell apart. The night's best session gets a green ★ chip. The worst gets an orange ⚠︎. Click into either to see exactly why.

The summary view, with the night's best and worst sessions called out.

Guiding Quality

Why was that one frame so much worse than the others?

Drag horizontally on the chart to zoom into a spike. Switch the toolbar mode and drag to exclude a range instead — frames you know were bad (clouds, dew, a stray cable tug) drop out of the stats and the numbers recompute live. Settling bands appear as faint orange when settling failed and neutral grey when it succeeded — useful for telling apart "PHD2 lost the star and recovered" from "the dither went sideways and the next 30 frames were trash." Star mass and SNR are graphed beneath the main chart, both synced to the same hover position so you can answer the most common diagnostic question — was the star getting fainter, or was the seeing falling apart? — at a glance. Toggle pixels vs arc-seconds. Toggle RA/Dec vs raw dx/dy. The Y-axis snaps to ±0.5″, ±1″, ±2″, ±5″, ±10″, or auto.

Hover any frame, see RA, Dec, and SNR. Drag to zoom or to exclude.

Mount Calibration

Is my calibration actually any good?

A clean calibration cross looks like a T. West and East run along one axis in red, North and South run perpendicular in blue, and Backlash steps trail off in orange before the Dec leg starts. Ephemeris draws yours with a 1:1 aspect ratio, dashed concentric reference rings, and tells you the orthogonality error in degrees — the angular distance between the West and North legs minus 90°. Anything past 5° gets flagged in orange. Below 1° is what you want on a well-aligned mount with measured (not assumed) orthogonal axes. The header strip pulls out the RA rate, Dec rate, exposure, calibration step, calibration distance, declination, hour angle, and pier side — every value PHD2 used to build the calibration, surfaced in one row instead of buried in the log header.

A clean cal cross looks like a T. Anything else is a clue.

Periodic Error Analysis

What's that periodic spike in my guiding?

The FFT periodogram is the answer to "what's that periodic spike in my guiding?" Open the modal with ⌘F, pick RA or Dec, and Ephemeris runs a Hann-windowed real FFT on the included frames using Apple's Accelerate framework — the math runs in milliseconds even on a 30,000-frame combined session. The dominant period gets called out at the bottom. On a typical EQ-class mount that period is almost always the worm gear: an SkyWatcher EQ6 lands around 478 seconds, an HEQ5 around 638 seconds, a CGEM around 1436 seconds. On a high-end direct-drive or absolute-encoder mount, the dominant period is much harder to find because there isn't a worm. Drift correction is on by default (otherwise low-frequency drift swamps everything). Toggle it off to see what the raw signal looks like.

FFT analysis on RA — the dominant period is your worm gear, every time.

The Log Library

What has my rig been doing all season?

One night tells you about one night. The interesting questions are the ones a single log can't answer: is this getting better, was that a bad night or a bad setup, has anything changed since I re-tightened the OAG.

Point Ephemeris at a folder and it imports the lot, deduplicating as it goes, so re-importing the same directory next month adds the new nights and skips the ones it already has. Everything lands under a rig profile: focal length, pixel size, binning, reducer, mount class. The rig is what makes the numbers mean something. At 2800mm with a 0.7x reducer onto 3.76 micron pixels, the imaging scale is 0.40 arcseconds per pixel, and a 0.6″ night reads very differently at that scale than it does at 3″/px.

From there you get the things that only exist across nights: median, p75 and p90 RMS rather than a single number, total integration, and target clusters built by grouping sessions that point at the same patch of sky, so you can compare how the same object guided in February and April.

Fifty-six nights on one rig, plotted against its own imaging scale. The spike at the end of February is a bent off-axis guider. The library made that night findable. Working out why still took me weeks.

The Observations Engine

Every observation tells you where it came from.

Ephemeris runs 23 analysis rules over your library, 19 within a single night and 4 across nights, and writes what it notices in plain language. Each one is labelled with where the claim comes from, and this is the part that matters most.

PHD2 documentation

The rule is applying a threshold from PHD2's own manual. Orthogonality past 10 degrees, for example, is PHD2's line, not ours.

PHD2 measurement

The number came from PHD2 itself, usually a Guiding Assistant run, and Ephemeris is surfacing it verbatim rather than deriving anything.

Ephemeris heuristic

Our inference, from your data. Useful, and not authoritative. When a heuristic disagrees with a measurement, you can see that it's a heuristic doing the disagreeing.

Observations point at PHD2's own tools by name, because those tools are where the fix happens: the Calibration Assistant for orthogonality and Dec backlash, the Guiding Assistant for min-move and backlash measurement, Drift Align for polar alignment. Ephemeris reads logs after the fact. PHD2 is the thing holding the star.

What it deliberately won't do is claim causation. A pier-side RMS ratio of 2.2x is a fact about your night. "Your east side calibration is stale" is a hypothesis, and it gets written as one. I guided for weeks through a bent off-axis guider before I worked out what it was, and no log analysis would have found that, because the logs looked like bad seeing. A tool that told me confidently what was wrong would have told me the wrong thing.

One night, thirteen guide sessions, eight observations. Each one carries its source, its evidence, and the PHD2 tool that actually fixes it.

Ask Your Own Logs

This started with me pasting log files into Claude by hand.

I'd have a night that went sideways, no idea why, and I'd copy chunks of the guide log into a chat window and argue about it. It worked better than it had any right to. So I built the app a way to hand over structured data instead of me pasting text.

Turn on the MCP server in Settings and Claude Desktop, running on the same Mac, can query your library directly: rigs, nights, sessions, targets, observations, Guiding Assistant results, aggregate statistics. You ask questions in English. It reads real numbers rather than guessing.

Read-only

There is no write path. Nothing an AI says can modify your library, your logs, or your PHD2 configuration.

Loopback only

The server binds to your own machine. It isn't reachable from your network, let alone the internet.

Off by default

You turn it on. It's a checkbox, and it's off until you tick it.

Summaries, not raw data

Session level and above: per-session statistics, pointing context, night rollups, observations. No frame-level data, no raw log text, no FFT output, no calibration plot points.

Claude Desktop

Ephemeris connected

Ephemeris flags my min-move as too high on almost every night this season. Should I lower it?

list_observations rig: Edge-10m list_ga_results rig: Edge-10m

Before you change anything: those flags disagree with PHD2's own measurement, and it matters which one you trust.

The min-move observations are labelled Ephemeris heuristic. They estimate a seeing floor from each session's pre-algorithm distances, then conclude your 0.40 px setting is running 2.2x to 4.2x above it, and suggest something in the 0.10 to 0.18 range.

But your Guiding Assistant runs are labelled PHD2 measurement. PHD2 ran it twice on this rig, on 15 and 25 April, and recommended 0.40 and 0.50 px. You're already set to 0.40. You match what PHD2 measured.

That's a real conflict rather than a rounding difference, and it comes from how each number is produced. The Guiding Assistant measures directly, with guiding paused, over a couple of minutes. The heuristic infers backwards from a full night of already-corrected data, which tends to pull the estimated floor low. I'd weight the direct measurement.

If you want to settle it rather than pick a side: both of your GA runs are from April, and the shorter one sampled just over two minutes. Run Tools → Guiding Assistant again for longer, on a night with typical seeing, and see whether it still lands near 0.40.

Two patches of sky I shoot are about six degrees apart and guide completely differently. Any idea why?

list_targets rig: Edge-10m get_aggregate_stats rig: Edge-10m

You have two clusters sitting near RA 12.6h. The one at Dec +8.1 runs a median of 0.96″ across 115 sessions. The one at Dec +14.2 runs 0.37″ across 28. Same rig, six degrees apart, and a 2.6x difference.

Six degrees of declination on its own doesn't explain that. Before reaching for a mechanical cause, look at when you shot them: the +8 cluster spans 8 nights and the +14 cluster spans 5, so this may be which nights each target happened to land on rather than where it sits in the sky. Your p90 night is 1.72″ against a 0.58″ median, so two or three rough nights loaded into one cluster would produce exactly this.

I can't separate those two explanations from here. The connection gives me per-session summaries, not frame-level data, so I can see that the difference exists but not what the guide star was doing inside those sessions.

What would settle it: annotate the worst nights in Ephemeris with what the sky was actually doing. The cross-night rules use annotations to attribute step changes, so once the bad nights are labelled, the difference either survives or it doesn't.

A real exchange against a real library: 56 nights, 291 hours, one rig at 0.40″/px. Ephemeris hands over the numbers and their provenance. It doesn't hand over an answer.

Eighteen nights, 151 sessions, 53.8 hours on one rig. The dashed line is this rig's own imaging scale. Where your nights sit against that is the question worth asking.

Built for the Mac

What's the point of a native rewrite when phdlogview already runs on the Mac?

Andy Galasso ships phdlogview for Windows, Linux, and macOS, and has for years. The current macOS build is an Intel binary, so on Apple Silicon it runs through Rosetta. That works today, and on a lot of Macs it's still the easiest answer.

It has a clock on it. At WWDC25 Apple committed to supporting Rosetta through macOS 27, then largely retires it in macOS 28 in the autumn of 2027, keeping a subset for old unmaintained games built on Intel frameworks. macOS 26.4 already shows a notice when you launch something that needs it. That's Apple changing the platform, not Andy falling behind, and he may well ship an arm64 build. But every Intel-only binary on the Mac is now on a countdown.

Ephemeris was written for the Mac from the first line, in Swift and SwiftUI, shipped as a universal binary. That's the floor, not the pitch. The reason to keep it in your dock is that it remembers: one log is a chart, a folder of them is a record of what your rig does, and the analysis reads that record against your actual imaging scale. Two valid paths. Andy's is the cross-platform original, and it's where this all came from. Ephemeris is the one that only ever has to think about your Mac.

  • Swift & SwiftUI

    Not a port, not a wrapper. Apple's own UI frameworks throughout, written from scratch for the Mac.

  • Universal Binary

    One download, native code paths for Apple Silicon and Intel. No Rosetta on M-series Macs, and nothing to replace when Rosetta goes.

  • Apple Accelerate

    Real-FFT periodogram via vDSP, Apple's vectorized math library, instead of GSL. Milliseconds even on 30,000-frame sessions.

  • Swift Charts

    Apple's first-party charting framework powers every plot in the app: time series, calibration, FFT, scatter.

  • Apple Help Book

    Searchable, in-app help. Press ⌘? to open. Indexed by hiutil and integrated with macOS Help Viewer.

  • Sparkle Updates

    Signed appcast, EdDSA-verified, no App Store required. Ephemeris only checks for updates after you've said yes.

  • Notarized Direct Download

    Signed with a Developer ID, notarized by Apple, hardened runtime enabled. Downloaded from GitHub Releases, linked right from this page, and updated in place by Sparkle.

  • Sandboxed

    App Sandbox enabled. Reads only the files you explicitly drop or open. No telemetry, no analytics. The only network activity is the update check you opt into, and the optional MCP server binds to loopback on your own Mac.

  • Open Source

    GPLv3 on GitHub, the same license as upstream phdlogview. Read the code, file an issue, send a pull request.

Everything Else

The rest of what Ephemeris does.

Beyond the chart, calibration plot, and FFT, the things you'll reach for on a long imaging night.

Multi-Session Combining

Multi-select sessions in the sidebar to view as one virtual log. Real wall-clock gaps are preserved, so meridian flips and cloud breaks show as flat sections instead of straight lines that lie about your data.

Manual Frame Exclusion

Drag any time range to exclude it from stats. Cable tugs, gusts, dew. The numbers recompute live and the scatter overlay redraws.

Hover & Pin Selection

Click any frame to anchor a rule. The Inspector follows. Star mass and SNR sub-charts sync to the same position. Stays pinned while you scrub.

Bordered Inspector Cards

Right-pane inspector with cards for Session, Statistics, Optics, Mount, AO, and Events. Click any event to jump the chart to that frame.

Annotations

Record what you changed and when: a new guide camera, a re-greased worm, a night the wind never stopped. The cross-night rules use annotations to attribute step changes in your trend data instead of guessing at them.

Star Quality Ratings

Rate a session and the rating stays with it in the library, so "the good nights" becomes something you can sort by months later rather than something you half remember.

Polar Alignment Estimate

Ephemeris computes a König-formula polar-alignment estimate from your Dec drift and declination. Suppressed near the celestial pole where the math gets unstable.

CSV & PNG Export

Three CSV exports (session stats, frame data, full log summary) and the chart as PNG at 2× retina. Delivered through the system share sheet.

Forum Post Export

Export a session as formatted text ready to paste into Cloudy Nights or a forum thread, with the numbers already laid out. Asking for help stops meaning screenshotting a chart.

In-App Apple Help

Searchable Help Book, indexed by hiutil and integrated with the macOS Help Viewer. Press ⌘? from anywhere in the app.

Drag & Drop

Drop a .txt log on the Dock or app icon and Ephemeris opens it read-only. Tolerates Windows CRLF and clock-jump artifacts in PHD2 logs.

Shortcuts

Ephemeris exposes actions to the Shortcuts app, so importing a night's logs or pulling stats can run from a shortcut, a Focus trigger, or the menu bar.

Sortable Summary Table

Every guide session in one table (Started, Duration, Frames, RMS RA, RMS Dec, Total RMS) sortable by any column, with quality bars and Best/Worst chips.

How Ephemeris Compares

How is this different from phdlogview?

Three tools read PHD2 guide logs: Ephemeris (Mac-native, this page), phdlogview (the canonical viewer by Andy Galasso, available for Windows, Linux, and macOS), and PHD2's built-in log viewer (functional but minimal, embedded in PHD2 itself).

A note before the table: phdlogview is the upstream original, written and maintained by Andy Galasso, the same engineer who maintains PHD2 itself. Ephemeris exists because phdlogview exists. The comparison below isn't a competition; it's a "where does each tool fit" guide for Mac users specifically. On Windows, Linux, or Intel Macs, phdlogview is a fully supported and well-maintained tool.

Capability Ephemeris phdlogview PHD2 built-in
Native Mac UX ✓ Liquid Glass, drag-and-drop, native menus ~ wxWidgets cross-platform UI toolkit ~ Embedded in PHD2's UI
Apple Silicon native ✓ Universal binary ~ Intel binary, needs Rosetta (retiring in macOS 28) ~ Intel binary via Rosetta
Time-series chart with hover/pin
Drag-to-zoom & drag-to-exclude
Calibration XY plot ✓ With orthogonality readout ~ Basic
FFT periodogram ✓ Hann + Apple Accelerate ✓ Hamming + GSL
Multi-session combining (gaps preserved) ✓ Real wall-clock gaps
CSV & PNG export ✓ Three CSVs + chart PNG
In-app Apple Help ✓ Searchable, indexed
Persistent log library ✓ Per-rig, deduplicated import
Cross-night trend analysis ✓ Median, p75, p90, target clusters
Plain-language observations ✓ 23 rules, source-labelled
AI assistant access ✓ Opt-in read-only MCP
Open source ✓ GPLv3 ✓ GPLv3 ✓ BSD
Free
Platform macOS 15+ Windows / Linux / macOS (Intel only) Wherever PHD2 runs

phdlogview works on every platform PHD2 runs on, including macOS, and Andy ships builds going back to Mojave. On Windows and Linux none of the Rosetta question applies at all. Ephemeris is the option for Mac users who want an Apple Silicon-native binary with a shelf life past 2027, and who want the library and the observations rather than a viewer for one night at a time. Both projects are GPLv3 and serve the same goal. Pick whichever fits your workflow.

Open Source

Free, with the door left open for support.

Two short stories — why this app is free, and how to chip in if it's saved you a frustrating night of debugging.

Why Ephemeris is free.

Ephemeris is a Mac-native re-implementation of phdlogview, the original PHD2 log viewer written by Andy Galasso, the same engineer who has maintained PHD2 itself for years. phdlogview is GPLv3, so any work derived from it is GPLv3. That's how the license works, and it's the right outcome here: the tool that tells you what your guiding did should be a tool whose source you can read.

Source on GitHub. License at gnu.org/licenses/gpl-3.0.

Support development.

If Ephemeris saves you a night of frustrated debugging, or helps you finally diagnose that worm-gear period you've been chasing, consider chipping in on Patreon. Your support pays for development time on this app, the next open-source utility, and the ongoing cost of running Mac Observatory. Patreon is optional. Ephemeris is and will remain free.

Become a Supporter

Donating doesn't unlock features. There aren't any locked features.

Mac Observatory Suite

Built for the Mac. Built for Astronomers.

Native macOS apps filling the gaps the astronomy community has been waiting for.

The Observing Workflow   Look Up → Capture → Process → Archive

Transit
Astronomical Events
Mac App Store
Laminar
Planetary Capture
Mac App Store
Strata
Stack & Sharpen
Public Beta
Meridian
Deep Sky Archive
Mac App Store

It starts with Transit: live conditions and tonight's events tell you whether the sky is worth it. From there the planetary chain takes over, with Laminar capturing and Strata stacking and sharpening on the GPU. Meridian covers the other half of the hobby, turning a deep sky imaging archive into a catalog you can actually search.

Guiding Diagnostics   Free & Open Source

Ephemeris
PHD2 guide log analysis: read one night in detail, or a season of them at once, with observations that tell you where they came from.

Swift & SwiftUI · Apple Silicon Native · Metal GPU · No Subscriptions

Ready to read your PHD2 logs natively?

Ephemeris 2.0 is available now. Download below, or grab the latest release directly from GitHub.

Free · GPLv3 · macOS 15 Sequoia or later

Frequently Asked Questions

The questions deep-sky imagers actually ask about reading PHD2 guide logs, RMS, and what those numbers mean for your images.

What does total RMS actually tell me about my guiding quality?

Total RMS (root-mean-square) is the average size of your guiding error in pixels or arc-seconds, computed across every included frame in a session. It's a single number that summarizes how much your star wandered from the lock position during exposures. Lower is better, and it directly affects how much trailing or smearing shows up in your final integrated image: RMS bigger than the diameter of a star at your image scale will show as elongated stars. Ephemeris reports RMS RA and RMS Dec separately, plus the geometric total, and that decomposition matters because the two axes fail in different ways.

What's a "good" total RMS number for my setup?

The rule you'll see quoted is that total RMS should come in under your image scale, ideally under half of it. It's a reasonable starting point at moderate scales and it falls apart at long focal lengths. At 0.40 arcseconds per pixel, half your image scale is 0.20″, which is below the seeing floor most nights, on most sites, for most people. A rule that says almost every night failed isn't telling you anything.

The more useful question is how tonight compares to your own nights. Ephemeris keeps a rig profile with your real imaging scale and a library of everything that rig has done, so it can show you your median, your p75 and your p90 instead of one number and a threshold. A night at your median is normal. A night at your p90 is worth opening up and looking at. That's a comparison against your sky and your equipment rather than against someone else's rule of thumb.

How does pixel scale change what good guiding looks like?

Pixel scale (arcseconds per pixel) is a function of your imaging camera's pixel size and your telescope's focal length. A short refractor with a small-pixel camera might run at 3″/pixel, where the seeing limit is fundamentally above your pixel resolution and guiding errors of half an arc-second are invisible. A long-focal-length CDK with the same camera might run at 0.4″/pixel, and now every guiding twitch is recorded, so the same 0.5″ RMS that was invisible before is a star-elongation problem. Ephemeris doesn't decide what's good for you; it surfaces the pixel scale right alongside the RMS so you can make the call yourself.

Why does total RMS matter more than RA RMS or Dec RMS alone?

Because stars are points, not lines. If your RA RMS is 0.3″ and your Dec RMS is 0.2″, the total error is the geometric combination, about 0.36″, and that's the radius of the smear circle your star paints on the sensor during an exposure. RA-only or Dec-only RMS is useful for diagnosing the cause of poor guiding (worm-gear period error shows up in RA, polar misalignment shows up in Dec drift), but for assessing your final image quality, total RMS is the number that matters.

How do I tell if my drift is polar alignment or mount tracking?

The signature is in the axis. Persistent Dec drift, a slow monotonic line in the chart over many minutes, is almost always polar alignment. Mount tracking errors show up as RA periodicity (worm-gear cycles) plus possible random scatter. Ephemeris computes the König-formula polar-alignment estimate from your Dec drift and declination, displays it in arcminutes, and suppresses it near the celestial pole where the math becomes unstable. If your polar-align estimate is reading a few arcminutes after a session that was supposed to be well-aligned, your Dec drift is telling you something.

What does the FFT periodogram show that the chart doesn't?

The chart shows error as a function of time. The FFT shows error as a function of frequency. They surface different things. A worm-gear period of 478 seconds will show up in the chart as a slight repeating wave (often invisible in the noise) and in the FFT as a sharp spike at exactly 478 seconds. That spike is impossible to miss. The dominant period in the FFT is almost always your mount's worm, and Ephemeris labels it for you in the modal. Once you know the period, you know which mechanical component to investigate: PEC training, gear regreasing, or replacement.

Why does orthogonality error matter, and what's an acceptable value?

Calibration measures how the mount's RA and Dec axes are oriented relative to the camera. If those axes aren't actually 90° apart in the calibration plot, PHD2's correction pulses won't move the star in clean RA and Dec directions. They'll have a cross-axis component that fights the guiding algorithm. Below 1° is excellent. 1 to 5° is fine. Above 5° is a flag, and Ephemeris colors it orange so you can't miss it. High orthogonality error usually means your mount's polar axis isn't level, your axes are mechanically misaligned, or the calibration ran while the star was being affected by something else (cable drag, dew building on the corrector).

How is Ephemeris different from phdlogview?

On a single night they're close: same analyses, same answers. phdlogview is the canonical viewer, written and maintained by Andy Galasso (who also maintains PHD2 itself), and Andy ships builds for Windows, Linux, and macOS. The current Mac download is an Intel binary built with the wxWidgets cross-platform UI toolkit and GSL for math; on Apple Silicon it runs translated through Rosetta.

Ephemeris is a complementary Mac-native rewrite in Swift and SwiftUI, with Apple Accelerate for the FFT and a universal binary that runs natively on both Apple Silicon and Intel. Where it goes further is across nights: a persistent library organized by rig, cross-night trends, and plain-language observations labelled with where each one came from. Both projects are GPLv3 and aim at the same thing, helping you understand your guiding. Pick the one that fits your platform and your taste.

Why is Ephemeris GPLv3?

phdlogview, the upstream project, is GPLv3, and work derived from a GPLv3 project stays GPLv3. That's the license working as designed. In practice it means you can read exactly how every number on screen is computed, file an issue when one looks wrong, and fork the whole thing if I ever stop maintaining it. Ephemeris is distributed through GitHub Releases, signed and notarized.

Does donating to your Patreon get me anything extra?

No. There aren't any locked features in Ephemeris and there won't be, because that would make the app non-free in spirit even if it remained free in license. The Patreon exists for people who want to support open-source work and help fund the next utility. Donating gets you the satisfaction of having paid for something you believed in. That's it.