Vernissage extensions to ActivityPub

Abstract. This document describes a set of JSON object extensions used in the ActivityPub protocol by the Vernissage platform. These extensions are designed to support photo-centric platforms by enriching images with detailed camera metadata - such as lens information, exposure time, focal length, ISO sensitivity, aperture settings, and related capture parameters. While not part of the core ActivityPub specification, these extensions aim to be interoperable and safely ignored by clients that do not support them.

1. Introduction

The Vernissage platform introduces additional fields to ActivityPub objects to enhance the experience of publishing and consuming photographic content. These extensions are primarily intended for applications focused on photography and visual media. The fields are added using custom context definitions and are compatible with the ActivityStreams JSON-LD structure.

Base URI: https://joinvernissage.org/ns#

Contains terms used for Vernissage features:

The full @context definition including all custom terms is as follows:


"@context": [
  "https://www.w3.org/ns/activitystreams",
  {
    ... (other extensions) ...
    "photos": "https://joinvernissage.org/ns#",
    "geonameId": "photos:geonameId",
    "exif": "photos:exif",
    "Category": "photos:Category"
  }
]

2. GeoNames 🔗

This extension introduces the geonameId property - a unique identifier for a place in the GeoNames database. Including a geonameId lets clients:

Example:


{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "photos": "https://joinvernissage.org/ns#",
      "geonameId": "photos:geonameId",
      "schema": "http://schema.org#",
      "addressCountry": "schema:addressCountry"
    }
  ],
  "type": "Note",
  "url": "http://joinvernissage.org/@user/7487297782810677484",
  "attachments": [{
    "type": "Image",
    "url": "https://joinvernissage.org/0994397cf69742f68bdd94ebb66463c7.jpg",
    "mediaType": "image/jpeg",
    "location": {
      "geonameId": "3081368",           // unique GeoNames identifier.
      "latitude": "51,1",
      "longitude": "17,03333",
      "name": "Wrocław",
      "addressCountry": "PL",
      "type": "Place"
    }
  }]
}

2.1 Properties

3. Exif 🔗

The exif extension allows inclusion of photographic metadata (commonly known as EXIF) to assist in cataloging, editing, and analysis of images. This may include camera parameters and GPS location. Inclusion of GPS metadata must be explicitly acknowledged by the user due to its precision and privacy implications.

Example:


{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "photos": "https://joinvernissage.org/ns#",
      "exif": "photos:exif"
    }
  ],
  "type": "Note",
  "url": "http://joinvernissage.org/@user/7487297782810677484",
  "attachments": [{
    "type": "Image",
    "url": "https://joinvernissage.org/0994397cf69742f68bdd94ebb66463c7.jpg",
    "mediaType": "image/jpeg",
    "exif": {
      "createDate": "2025-02-27T17:38:49.408Z",
      "exposureTime": "1/200",
      "fNumber": "f/2.2",
      "flash": "Flash did not fire, compulsory flash mode",
      "focalLenIn35mmFilm": "85",
      "focalLength": "85",
      "latitude": "51.110501666666664N",
      "longitude": "17.033457778333332E",
      "lens": "Zeiss Batis 1.8/85",
      "make": "SONY",
      "model": "ILCE-7M4",
      "photographicSensitivity": "3200",
      "software": "Capture One Macintosh"
    }
  }]
}

3.1 Properties

All of these fields are optional. However, due to the sensitive nature of latitude and longitude, platforms must clearly inform the user and obtain consent before including them.

4. Category 🔗

The Category extension is an extension of the tag property from ActivityPub. Thanks to this extension, in addition to the Mention and Hashtag types, we can also support the Category type. Categories can be found in many contexts, such as article categories on websites. In Vernissage, we can assign categories to photos.

Although the extension allows assigning multiple categories to an object, Vernissage supports only one category per photo. If a collection contains more than one category, the first one will be used.

Example:


{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "Category": "photos:Category",
      "photos": "https://joinvernissage.org/ns#"
    }
  ],
  "attributedTo": "https://joinvernissage.org/actors/johndoe",
  "cc": [
    "https://joinvernissage.org/actors/johndoe/followers"
  ],
  "content": "

Note text

", "id": "https://joinvernissage.org/actors/johndoe/statuses/7359535244628142081", "published": "2024-04-19T11:15:42.779Z", "tag": [ { "href": "https://joinvernissage.org/categories/Abstract", "name": "Abstract", "type": "Category" } ], "to": [ "https://www.w3.org/ns/activitystreams#Public" ], "type": "Note", "url": "https://joinvernissage.org/@johndoe/7359535244628142081" }

4.1 Properties