How it works
PanoPosts adapts one wide or 360° photo to wherever you want to post it. For Facebook, Google Photos, Flickr, Kuula, and Google Street View it embeds GPano — a small block of metadata tags those viewers all read to recognize a JPEG as a panorama. For Instagram — which has no native panorama viewer — it slices the image into a swipeable carousel instead.
What Facebook checks
- • File is a JPEG.
- • EXIF contains a camera Make and Model.
- • XMP contains GPano tags with
ProjectionType=equirectangular. - • Aspect ratio is plausible for an equirectangular image (2:1 for full 360°).
- • File size and dimensions are within Facebook's upload limits.
The partial-pano trick
A wide stitched photo like 12135×1538 isn't a full sphere — but if you tell Facebook it's a cropped region of an imaginary full sphere, the swipe viewer kicks in. PanoPosts computes that imaginary sphere from the horizontal field of view you choose, then writes the crop offsets so the viewer pans across exactly the visible region.
Instagram carousel
Instagram has no native panorama viewer, so PanoPosts takes a different approach: it slices your wide image into 1:1 or 4:5 slides and packs them into a zip you upload as a multi-image post. Followers swipe through the slides like panning across the original. No GPano tags are written for Instagram — they'd be ignored anyway.
What is GPano?
GPano isn't a separate file format, app, or viewer — it's a Google-defined XMP metadata namespace. Think of it as a small block of tags PanoPosts embeds inside your JPEG's existing metadata that says "this is a panorama, here's its shape, and here's where the viewer should open."
All GPano tags share the same namespace URL — http://ns.google.com/photos/1.0/panorama/ — which is the lingua franca that Facebook, Google Photos, Flickr, Kuula, and Google Street View all read to decide whether to render a swipe/pan viewer instead of a flat image.
GPano XMP doesn't travel alone. PanoPosts also writes EXIF Make/Model (so platforms that demand a camera identity accept the file) and, for Street View exports, an EXIF GPS block (mandatory — Google rejects panoramas without coordinates). Together those three pieces — GPano XMP, EXIF identity, EXIF GPS — form the full "panorama signature" the glossary below catalogs.
Tag glossary
Every tag PanoPosts writes, grouped by purpose. Tag names are the literal attribute names you'd see in a metadata inspector like ExifTool.
Identification (always written)
- GPano:UsePanoramaViewer
- 'True' tells viewers to open the swipe/pan UI instead of showing a flat image. Without this, Facebook treats the JPEG as an ordinary photo.
- GPano:ProjectionType
- Always 'equirectangular' — tells viewers the image uses a sphere/strip projection.
Geometry (always written)
- GPano:FullPanoWidthPixels / FullPanoHeightPixels
- Dimensions of the imaginary full 360° sphere. For partial panos this is larger than your actual image.
- GPano:CroppedAreaImageWidthPixels / HeightPixels
- The dimensions of your actual image — what part of the full sphere it occupies.
- GPano:CroppedAreaLeftPixels / TopPixels
- Where the visible strip is positioned inside the imaginary full sphere. Centered by default.
Opening view (always written)
- GPano:PoseHeadingDegrees
- The camera's compass heading in degrees (0–360°). For full-360 exports PanoPosts adds a +180° offset because Facebook's viewer treats 0° as the back of the image.
- GPano:InitialViewHeadingDegrees
- The heading the viewer opens to. For partials it's a signed offset around the crop center wrapped into 0..360 (e.g. −1° → 359°). For full-360 the same +180° Facebook offset applies.
- GPano:InitialHorizontalFOVDegrees
- How zoomed-in the viewer opens, in degrees. PanoPosts caps this at 75° because that's Facebook's maximum opening field of view.
Pitch (full 360° only — omitted on partials)
- GPano:PosePitchDegrees
- The camera's vertical tilt in degrees, clamped to ±90°. Written for full 360° exports only.
- GPano:InitialViewPitchDegrees
- The vertical tilt the viewer opens to, clamped to ±90°. Written for full 360° exports only.
EXIF identity (always written; injected if missing)
- EXIF Make / Model
- Facebook and other platforms sometimes refuse panoramas that lack camera identity. PanoPosts injects 'PanoPosts' / 'Multi-platform' when the source file has neither.
EXIF GPS (Street View export only — required by Google)
- EXIF GPSLatitude / GPSLongitude (+ Refs)
- Latitude and longitude in degrees-minutes-seconds rationals plus N/S/E/W reference. Required for Street View — Google places your panorama on the map using these.
- EXIF GPSAltitude / GPSDateStamp / GPSTimeStamp
- Optional height above/below sea level (1mm precision) and capture date/time. PanoPosts writes them when known; Street View accepts panoramas without them.
PanoPosts attribution (always written)
- x:xmptk
- Toolkit attribute on the XMP root, set to 'PanoPosts'. Lets a metadata inspector see which tool produced the file.
- GPano:FirstPhotoDate
- ISO timestamp of when PanoPosts prepared this JPEG. Useful for distinguishing re-exports from original captures.
- GPano:SourcePhotosCount
- Always '1' — PanoPosts treats your input as a single source image rather than a stitch of multiple shots.