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.
Contains terms used for Vernissage features:
- geonameId —
geonameId
property for GeoNames identifier. - exif —
exif
property for camera metadata. - Category —
Category
property for categorizing entity.
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:
- disambiguate places that share a name;
- cross-link Vernissage objects with external services (GIS, weather, open data);
- offer users a direct link to detailed information (https://www.geonames.org/{geonameId}).
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
geonameId
— SHOULD be thegeonameid
returned by the GeoNames API.
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
exif:createDate
— ISO 8601 timestamp of photo creation.exif:exposureTime
— Exposure time (e.g.,"1/100"
or"4"
for 4 seconds).exif:fNumber
— Aperture value (e.g.,"f/1.8"
).exif:flash
— Descriptive flash usage string.exif:focalLenIn35mmFilm
— 35 mm equivalent focal length.exif:focalLength
— Focal length as reported by the camera.exif:latitude
— Exact latitude of photo location.exif:longitude
— Exact longitude of photo location.exif:lens
— Lens model name.exif:make
— Camera manufacturer.exif:model
— Camera model.exif:photographicSensitivity
— ISO sensitivity.exif:software
— Editing software used.
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
type
— For that extensions always:Category
.name
— Name of the category.href
— Reference to the category (URL).