Readable
AstroPlan files are UTF-8 JSON, so developers and power users can inspect them.
Draft standard
AstroPlan is a proposed JSON-based file format for moving observing plans between astronomy planning tools, smart-telescope apps, and capture controllers without forcing every app to speak a private export language.
Why this exists
Many planning apps can identify good targets, many telescope apps can execute a plan, and many observers move between both. AstroPlan is intentionally modest: it names the targets, carries coordinates, preserves ordering, and optionally includes schedule timing. That is enough for an app to import a useful observing plan without understanding every private feature of the app that created it.
AstroPlan files are UTF-8 JSON, so developers and power users can inspect them.
Coordinates use J2000 equatorial values, and timing uses ISO timestamps and offsets.
Readers should ignore fields they do not understand, allowing safe experimentation.
Supporting materials
The AstroPlan GitHub repository contains the complete draft specification and machine-readable JSON Schema, along with registered extension definitions. It also includes real application exports, valid and deliberately invalid conformance fixtures, and a validator that developers can use while building import and export support.
Supporting materials include implementation prompts for Swift, Python, TypeScript, and Kotlin, plus an installable AstroPlan skill that can read, create, edit, and validate plan files. Contributions are welcome through issues and pull requests; the repository's contribution guide describes the compatibility and data-safety expectations for proposed changes.
License and adoption
AstroPlan is an open draft standard. The specification, schemas, examples, validator, implementation prompts, and skill in the public repository are available under the MIT License . Developers may implement AstroPlan in commercial or noncommercial applications without requesting permission from AstroGuide.
Applications that support AstroPlan remain independent implementations; compatibility does not imply affiliation with or endorsement by AstroGuide. Copies or substantial portions of repository materials should retain the included copyright and license notice.
Container
.astroplanZ application/vnd.astroplan+json
AstroGuide currently registers .astroplan as an Apple file
document type and imports files by extension. Other apps can use the extension,
JSON payload, and MIME recommendation independently of Apple platform
identifiers.
Payload shape
| Field | Type | Use | Description |
|---|---|---|---|
version | integer | Required | AstroPlan schema version. The current draft version is 1. |
title | string | Required | Human-readable plan title. |
author | string | Optional | Application, service, or person that created the plan. |
created | ISO 8601 timestamp | Required | Creation timestamp for the exported file. |
notes | string | Optional | Plan-level notes that should travel with the schedule. |
scheduleContext | object | Optional | Shared context for schedule timing, currently time zone and observing window. |
targets | array | Required | Ordered list of targets in the observing plan. |
The schedule context describes the shared observing window. Apps that only exchange target lists can omit it.
| Field | Type | Use | Description |
|---|---|---|---|
timeZone | IANA time zone string | Required when scheduleContext is present | Example: America/New_York. Used for local display and schedule interpretation. |
windowStart | ISO 8601 timestamp | Optional | Start of the planning window. Required if using startOffsetMinutes as schedule timing. |
windowEnd | ISO 8601 timestamp | Optional | End of the planning window. |
A target should include a stable catalog identifier and, whenever possible, both machine-readable decimal coordinates and human-readable coordinate strings.
Every array occurrence is a separate schedule entry. Several
entries may refer to the same catalog subject, and editors should
use entryId when stable occurrence identity matters.
| Field | Type | Use | Description |
|---|---|---|---|
entryId | string | Optional, recommended for editors | Stable identity for this schedule occurrence. It identifies the entry, not the catalog subject. |
name | string | Required | Display name to show to users. |
catalogId | string | Required | Stable catalog identifier or application-level target key. |
ra | string | Optional | Right ascension string, preferably J2000 sexagesimal such as 09h55m30s. |
dec | string | Optional | Declination string, preferably J2000 sexagesimal such as +69d03m54s. |
rightAscensionHours | number | Recommended | J2000 right ascension in decimal hours, normalized to [0, 24). |
declinationDegrees | number | Recommended | J2000 declination in decimal degrees, from -90 to +90. |
startOffsetMinutes | integer | Optional | Scheduled start offset in minutes from scheduleContext.windowStart. |
durationMinutes | integer | Optional | Scheduled target duration in minutes. |
startTime | ISO 8601 timestamp | Optional | Absolute scheduled start timestamp, useful for display and import fallback. |
endTime | ISO 8601 timestamp | Optional | Absolute scheduled end timestamp, useful for display and import fallback. |
timeZone | IANA time zone string | Optional | Target-level time zone override. Usually the same as scheduleContext.timeZone. |
notes | string | Optional | Target-specific planning notes. |
Schedule rules
targets preserves the author
application's presentation order.
scheduleContext.windowStart and startOffsetMinutes
are present, the offset is the preferred portable schedule timing.
durationMinutes describes how long the target should remain
scheduled.
startTime and endTime are useful display and
fallback values, especially for apps that do not use a shared window
model.
Examples
These sample files can be used as fixtures when testing AstroPlan import support. They are real v1 payloads with schedule windows, target ordering, target notes, local timestamps, offsets, durations, and J2000 coordinate fields.
A framed Capture Studio schedule with repeated subjects, custom centers, frame scale, position angle, filters, and equipment context.
5 targets · scheduled survey Seestar surveyA five-target survey plan with notes, local schedule timing, offsets, and J2000 coordinates.
5 targets · scheduled baseline Research baseline - deepA deeper scheduled plan that exercises ordered targets, equal durations, and mixed target types.
The Heart and Soul example is an unmodified AstroGuide export using
the registered captureStudioFraming extension. Its core
coordinates preserve catalog-subject identity, while the extension
carries the actual panel center, frame scale, position angle,
filters, and equipment context.
The full extension definition and JSON Schema are maintained in the public AstroPlan repository.
This is the smallest useful AstroPlan: a title, a creation time, and ordered targets with identifiers and coordinates.
{
"version": 1,
"title": "Galaxy Starter Plan",
"author": "Example Planner",
"created": "2026-07-28T18:30:00Z",
"targets": [
{
"name": "Bode's Galaxy",
"catalogId": "M81",
"ra": "09h55m30s",
"dec": "+69d03m54s",
"rightAscensionHours": 9.925,
"declinationDegrees": 69.065
},
{
"name": "Cigar Galaxy",
"catalogId": "M82",
"rightAscensionHours": 9.9337,
"declinationDegrees": 69.6797
}
]
} This example adds a time zone, night window, offsets, durations, and local timestamp strings. It can be imported as an ordered observing schedule.
{
"version": 1,
"title": "Cygnus Narrowband Night",
"author": "AstroGuide",
"created": "2026-07-28T18:30:00Z",
"notes": "A portable observing schedule for a summer emission-region session.",
"scheduleContext": {
"timeZone": "America/New_York",
"windowStart": "2026-07-29T01:00:00Z",
"windowEnd": "2026-07-29T08:30:00Z"
},
"targets": [
{
"name": "North America Nebula",
"catalogId": "NGC7000",
"ra": "20h58m48s",
"dec": "+44d19m00s",
"rightAscensionHours": 20.98,
"declinationDegrees": 44.3167,
"startOffsetMinutes": 0,
"durationMinutes": 120,
"startTime": "2026-07-28T21:00:00-04:00",
"endTime": "2026-07-28T23:00:00-04:00",
"timeZone": "America/New_York",
"notes": "Begin while the subject is climbing."
},
{
"name": "Crescent Nebula",
"catalogId": "NGC6888",
"rightAscensionHours": 20.201,
"declinationDegrees": 38.354,
"startOffsetMinutes": 130,
"durationMinutes": 90
}
]
} Interop guidance
version: 1.The unknown-field rule is important. It allows future framing, mosaic, filter, exposure, and equipment metadata to appear in real files before every app supports every feature.
{
"version": 1,
"title": "Future Compatible Plan",
"created": "2026-07-28T18:30:00Z",
"futurePlannerField": "Readers should ignore this.",
"targets": [
{
"name": "IC 1396",
"catalogId": "IC 1396",
"rightAscensionHours": 21.648333,
"declinationDegrees": 57.488889,
"vendor.example.framing": {
"centerRightAscensionHours": 21.64,
"centerDeclinationDegrees": 57.45,
"rotationDegrees": 12.5
}
}
]
} Developer feedback wanted
If you build astronomy planning software, capture tools, smart-telescope utilities, or observation logging apps, feedback on this draft is welcome. The goal is a practical, low-friction exchange format that several small apps can support first, then propose more broadly. The specification, schema, examples, implementation prompts, and AstroPlan agent skill are maintained in a public repository.