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

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.