feat(schema): Add social media post and content modeling schema

Social Media Post Classes:
- SocialMediaPost: Base class for platform-agnostic post modeling
- SocialMediaPostType: Abstract base for post type taxonomy
- SocialMediaPostTypes: Concrete post types (TextPost, ImagePost,
  CarouselPost, StoryPost, ReelPost, ArticlePost, PollPost, EventPost)

Content Classes:
- SocialMediaContent: Rich content modeling with media attachments,
  hashtags, mentions, links, and engagement metrics

Features:
- Platform-specific post type mappings (Instagram, LinkedIn, Twitter, etc.)
- Engagement analytics (likes, comments, shares, saves)
- Heritage institution content categorization
- Media attachment handling (images, videos, documents)
- Hashtag and mention extraction for heritage topic tracking
This commit is contained in:
kempersc 2025-12-16 20:06:08 +01:00
parent 767fb8ca80
commit 8a4727eb34
4 changed files with 2280 additions and 0 deletions

View file

@ -0,0 +1,450 @@
# Social Media Content Base Class
# Abstract base class for all social media content items (posts, videos, comments, etc.)
#
# CONCEPTUAL HIERARCHY:
#
# SocialMediaPlatformType → SocialMediaProfile → SocialMediaContent
# (Platform) (Account/Channel) (Individual Content)
#
# This class represents CONTENT posted on social media platforms,
# distinct from the profile/channel itself (SocialMediaProfile).
#
# DESIGN RATIONALE:
# Heritage custodians post content on social media platforms. This content
# (videos, images, text posts) has intrinsic value for documenting:
# - Institutional communications
# - Collection highlights
# - Event recordings
# - Educational materials
# - Public engagement history
#
# This abstract base class provides common properties for all content types.
id: https://nde.nl/ontology/hc/class/SocialMediaContent
name: social_media_content_class
title: Social Media Content Base Class
imports:
- linkml:types
- ./SocialMediaProfile
- ./SocialMediaPlatformType
- ./TimeSpan
- ./WebObservation
- ../slots/language
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
foaf: http://xmlns.com/foaf/0.1/
dcterms: http://purl.org/dc/terms/
prov: http://www.w3.org/ns/prov#
crm: http://www.cidoc-crm.org/cidoc-crm/
skos: http://www.w3.org/2004/02/skos/core#
as: https://www.w3.org/ns/activitystreams#
default_prefix: hc
classes:
SocialMediaContent:
class_uri: as:Object
abstract: true
description: |
Abstract base class for all social media content items.
**DEFINITION**:
SocialMediaContent represents discrete pieces of content published on social media
platforms. This includes videos, images, text posts, stories, and other content types.
Each content item is posted by a SocialMediaProfile (the channel/account).
**CRITICAL: CONTENT vs PROFILE vs PLATFORM**:
| Class | Represents | Example | Cardinality |
|-------|------------|---------|-------------|
| SocialMediaPlatformType | Platform category | YouTube | ~25 types |
| SocialMediaProfile | Account/channel | @rijksmuseum | Thousands |
| **SocialMediaContent** | Individual content | A video, post | Millions |
**ACTIVITY STREAMS 2.0 ALIGNMENT**:
Maps to `as:Object` from W3C Activity Streams 2.0 vocabulary:
- as:Object is the base type for content in social media
- Subclasses map to as:Video, as:Image, as:Note, etc.
- Enables federation with ActivityPub-based platforms (Mastodon, PeerTube)
**HERITAGE INSTITUTION CONTEXT**:
Social media content from heritage institutions includes:
1. **Official content** (posted by the institution):
- Collection highlights
- Exhibition announcements
- Educational videos
- Behind-the-scenes content
- Event recordings
2. **Third-party content** (about the institution):
- Visitor videos/photos
- News coverage
- Academic discussions
- Review content
3. **User-generated content** (mentions):
- Tagged posts
- Check-ins
- Comments/discussions
**PROVENANCE TRACKING**:
Content items are OBSERVATIONAL data retrieved via:
- Platform APIs (YouTube Data API, Twitter API, etc.)
- Web scraping (when API unavailable)
- Manual archival
Each content record includes:
- `retrieval_timestamp`: When content was fetched
- `api_endpoint`: Which API/method was used
- `metrics_observed_date`: When engagement metrics were recorded
**TEMPORAL CONSIDERATIONS**:
Content has multiple temporal dimensions:
- `published_at`: When originally posted
- `updated_at`: Last modification by author
- `retrieval_timestamp`: When we fetched it
- `metrics_observed_date`: When metrics (views, likes) were recorded
Engagement metrics change constantly; always record observation timestamp.
**SUBCLASSES**:
- VideoPost: YouTube, TikTok, Vimeo videos
- ImagePost: Instagram, Pinterest posts (future)
- TextPost: Twitter/X, Mastodon posts (future)
- StoryPost: Instagram/Facebook stories (future)
exact_mappings:
- as:Object
close_mappings:
- schema:CreativeWork
- crm:E73_Information_Object
related_mappings:
- schema:SocialMediaPosting
- dcterms:BibliographicResource
slots:
- content_id
- content_url
- platform_type
- posted_by_profile
- title
- description
- published_at
- updated_at
- language
- tags
- thumbnail_url
- is_official_content
- content_category
- retrieval_timestamp
- api_endpoint
- api_version
slot_usage:
content_id:
slot_uri: dcterms:identifier
description: |
Unique identifier for this content item.
Format varies by platform:
- YouTube: Video ID (e.g., "dQw4w9WgXcQ")
- Twitter/X: Tweet ID (numeric string)
- Instagram: Media ID
Combined with platform type, this uniquely identifies content globally.
range: string
required: true
identifier: true
examples:
- value: "FbIoC-Owy-M"
description: "YouTube video ID"
content_url:
slot_uri: schema:url
description: |
Canonical URL to access this content on its native platform.
URL patterns by platform:
- YouTube: https://www.youtube.com/watch?v={video_id}
- Twitter/X: https://x.com/{user}/status/{tweet_id}
- Instagram: https://www.instagram.com/p/{shortcode}
range: uri
required: true
pattern: "^https?://"
examples:
- value: "https://www.youtube.com/watch?v=FbIoC-Owy-M"
description: "YouTube video URL"
platform_type:
slot_uri: dcterms:type
description: |
The type of social media platform where this content was posted.
Uses SocialMediaPlatformType class hierarchy for standardized categorization.
range: SocialMediaPlatformType
required: true
examples:
- value: "YouTube"
description: "Content from YouTube platform"
posted_by_profile:
slot_uri: as:attributedTo
description: |
The social media profile (account/channel) that posted this content.
Activity Streams: attributedTo identifies the actor responsible for the content.
Links to SocialMediaProfile which in turn links to the Custodian hub.
range: SocialMediaProfile
required: false
examples:
- value: "https://nde.nl/ontology/hc/social-media/nationaal-onderduikmuseum-youtube"
description: "Museum's YouTube channel profile"
title:
slot_uri: dcterms:title
description: |
Title or headline of the content.
Dublin Core: title for the content's name.
- YouTube videos: Video title
- Twitter/X: First line of tweet (or null)
- Instagram: Caption beginning
range: string
required: false
examples:
- value: "De Vrijheidsroute (aflevering 3) Zevenaar, Duiven, Westervoort"
description: "YouTube video title"
description:
slot_uri: dcterms:description
description: |
Full description or body text of the content.
Dublin Core: description for content text.
- YouTube: Video description
- Twitter/X: Full tweet text
- Instagram: Full caption
range: string
required: false
examples:
- value: "De videoreeks De Vrijheidsroute is gebaseerd op de gelijknamige fietsroute..."
description: "YouTube video description"
published_at:
slot_uri: dcterms:created
description: |
Date/time when content was originally published.
Dublin Core: created for publication timestamp.
ISO 8601 format (e.g., "2025-07-30T18:05:15Z").
range: datetime
required: true
examples:
- value: "2025-07-30T18:05:15Z"
description: "Published July 30, 2025"
updated_at:
slot_uri: dcterms:modified
description: |
Date/time when content was last modified by the author.
Dublin Core: modified for last update timestamp.
May be null if content has never been edited.
range: datetime
required: false
examples:
- value: "2025-08-01T10:30:00Z"
description: "Last edited August 1, 2025"
language:
slot_uri: dcterms:language
description: |
Primary language of the content.
Dublin Core: language for content language.
ISO 639-1 code (e.g., "nl", "en", "de").
range: string
required: false
examples:
- value: "nl"
description: "Dutch language content"
tags:
slot_uri: schema:keywords
description: |
Tags, hashtags, or keywords associated with the content.
Schema.org: keywords for topic classification.
Platform-specific:
- YouTube: Video tags (author-defined)
- Twitter/X: Hashtags
- Instagram: Hashtags from caption
range: string
multivalued: true
required: false
examples:
- value: ["80 jaar vrijheid", "wo2", "vrijheidsroute"]
description: "YouTube video tags"
thumbnail_url:
slot_uri: schema:thumbnailUrl
description: |
URL to a thumbnail/preview image for the content.
Schema.org: thumbnailUrl for preview image.
range: uri
required: false
examples:
- value: "https://i.ytimg.com/vi/FbIoC-Owy-M/hqdefault.jpg"
description: "YouTube video thumbnail"
is_official_content:
slot_uri: hc:isOfficialContent
description: |
Whether this content was posted by the heritage institution's official account.
- **true**: Posted by the custodian's verified/official account
- **false**: Third-party content (visitors, media, etc.) about the institution
Helps distinguish official communications from external coverage.
range: boolean
required: false
ifabsent: "true"
examples:
- value: true
description: "Posted by official museum channel"
content_category:
slot_uri: schema:genre
description: |
Category or genre of the content.
Schema.org: genre for content classification.
Platform-specific category systems:
- YouTube: Category ID (e.g., "22" = People & Blogs)
- Instagram: N/A
- TikTok: Category/trend
range: string
required: false
examples:
- value: "22"
description: "YouTube category ID for People & Blogs"
retrieval_timestamp:
slot_uri: prov:atTime
description: |
Timestamp when this content data was retrieved from the platform.
PROV-O: atTime for observation timestamp.
Critical for understanding data freshness, especially for metrics.
range: datetime
required: true
examples:
- value: "2025-12-01T23:16:22.294232+00:00"
description: "Retrieved December 1, 2025"
api_endpoint:
slot_uri: prov:wasGeneratedBy
description: |
The API endpoint or method used to retrieve this content.
PROV-O: wasGeneratedBy for generation method.
Examples:
- "https://www.googleapis.com/youtube/v3"
- "https://api.twitter.com/2/tweets"
- "web_scrape"
range: string
required: false
examples:
- value: "https://www.googleapis.com/youtube/v3"
description: "YouTube Data API v3"
api_version:
slot_uri: schema:softwareVersion
description: |
Version of the API used for retrieval.
Schema.org: softwareVersion for API version tracking.
range: string
required: false
examples:
- value: "v3"
description: "YouTube API version 3"
comments:
- "Abstract base class - use specific subclasses (VideoPost, ImagePost, etc.)"
- "Represents individual CONTENT items, not profiles or platforms"
- "Activity Streams 2.0 alignment enables ActivityPub federation"
- "Metrics are observational - always include retrieval_timestamp"
- "Supports both official institutional content and third-party coverage"
see_also:
- "https://www.w3.org/ns/activitystreams#Object"
- "https://schema.org/CreativeWork"
- "https://schema.org/SocialMediaPosting"
# Slot definitions
slots:
content_id:
description: Platform-specific unique identifier for content
range: string
content_url:
description: Canonical URL to access the content
range: uri
posted_by_profile:
description: Social media profile that posted this content
range: SocialMediaProfile
is_official_content:
description: Whether content is from official institutional account
range: boolean
content_category:
description: Platform-specific category/genre
range: string
retrieval_timestamp:
description: When content data was retrieved
range: datetime
api_endpoint:
description: API used to retrieve content
range: string
api_version:
description: Version of API used
range: string
tags:
description: Keywords/hashtags for the content
range: string
multivalued: true
thumbnail_url:
description: URL to preview/thumbnail image
range: uri

View file

@ -0,0 +1,540 @@
# Social Media Post Class
# Concrete class for social media posts with multivalued post type support
#
# CONCEPTUAL HIERARCHY:
#
# SocialMediaPlatformType → SocialMediaProfile → SocialMediaPost
# (Platform) (Account/Channel) (Individual Post)
# ↓
# post_types (multivalued)
# ↓
# SocialMediaPostType[]
#
# This class represents individual content items posted on social media platforms.
# A single post can have MULTIPLE post types (e.g., a carousel with images AND videos).
#
# DESIGN RATIONALE:
# Social media content often combines multiple formats:
# - A carousel may contain both images and videos
# - A thread consists of multiple text posts with attached media
# - A live stream becomes a standard video when archived
# - A podcast episode may also be published as a video
#
# The multivalued post_types slot captures this reality.
id: https://nde.nl/ontology/hc/class/SocialMediaPost
name: social_media_post_class
title: Social Media Post Class
imports:
- linkml:types
- ./SocialMediaProfile
- ./SocialMediaPlatformType
- ./SocialMediaPostType
- ./TimeSpan
- ./WebObservation
- ../slots/language
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
foaf: http://xmlns.com/foaf/0.1/
dcterms: http://purl.org/dc/terms/
prov: http://www.w3.org/ns/prov#
crm: http://www.cidoc-crm.org/cidoc-crm/
skos: http://www.w3.org/2004/02/skos/core#
as: https://www.w3.org/ns/activitystreams#
default_prefix: hc
classes:
SocialMediaPost:
class_uri: as:Object
abstract: false
description: |
Concrete class for social media posts/content items.
**DEFINITION**:
SocialMediaPost represents a discrete piece of content published on a social media
platform. This includes videos, images, text posts, stories, carousels, threads,
and other content types. Each post is published by a SocialMediaProfile (account/channel).
**CRITICAL: MULTIVALUED POST TYPES**:
A single SocialMediaPost can have **multiple** post types via the `post_types` slot.
This reflects the reality that social media content often combines formats:
| Post Example | Primary Type | Secondary Types |
|--------------|--------------|-----------------|
| Instagram carousel with videos | CarouselPostType | ImagePostType, VideoPostType |
| Twitter thread with images | ThreadPostType | TextPostType, ImagePostType |
| YouTube Live archived as video | LiveStreamPostType | VideoPostType |
| Podcast with video recording | AudioPostType | VideoPostType |
| Story highlight (saved) | StoryPostType | ImagePostType, VideoPostType |
**TYPE ORDERING CONVENTION**:
- First type in list = primary/dominant format
- Subsequent types = secondary characteristics
- Order matters for display and categorization
**CRITICAL: POST vs PROFILE vs PLATFORM**:
| Class | Represents | Example | Cardinality |
|-------|------------|---------|-------------|
| SocialMediaPlatformType | Platform category | YouTube | ~25 types |
| SocialMediaProfile | Account/channel | @rijksmuseum | Thousands |
| **SocialMediaPost** | Individual content | A video, post | Millions |
**ACTIVITY STREAMS 2.0 ALIGNMENT**:
Maps to `as:Object` from W3C Activity Streams 2.0 vocabulary:
- as:Object is the base type for content in social media
- Individual posts may also map to as:Video, as:Image, as:Note based on post_types
- Enables federation with ActivityPub-based platforms (Mastodon, PeerTube)
**HERITAGE INSTITUTION CONTEXT**:
Social media content from heritage institutions includes:
1. **Official content** (posted by the institution):
- Collection highlights (ImagePostType)
- Exhibition announcements (TextPostType)
- Educational videos (VideoPostType)
- Behind-the-scenes content (ShortVideoPostType, StoryPostType)
- Event recordings (LiveStreamPostType → VideoPostType)
- Curator interviews (VideoPostType, AudioPostType)
- Multi-image collection stories (CarouselPostType)
2. **Third-party content** (about the institution):
- Visitor videos/photos
- News coverage
- Academic discussions
- Review content
3. **User-generated content** (mentions):
- Tagged posts
- Check-ins
- Comments/discussions
**PROVENANCE TRACKING**:
Content items are OBSERVATIONAL data retrieved via:
- Platform APIs (YouTube Data API, Twitter API, etc.)
- Web scraping (when API unavailable)
- Manual archival
Each content record includes:
- `retrieval_timestamp`: When content was fetched
- `api_endpoint`: Which API/method was used
- `metrics_observed_date`: When engagement metrics were recorded
**TEMPORAL CONSIDERATIONS**:
Content has multiple temporal dimensions:
- `published_at`: When originally posted
- `updated_at`: Last modification by author
- `retrieval_timestamp`: When we fetched it
- `metrics_observed_date`: When metrics (views, likes) were recorded
Engagement metrics change constantly; always record observation timestamp.
**SUBCLASSES FOR SPECIALIZED CONTENT**:
While SocialMediaPost can represent any content with post_types,
specialized subclasses provide additional platform-specific slots:
- **VideoPost**: YouTube, TikTok, Vimeo videos (duration, definition, captions)
- **ImagePost**: Instagram, Pinterest posts (dimensions, alt_text) [future]
- **TextPost**: Twitter/X, Mastodon posts (character_count) [future]
- **StoryPost**: Instagram/Facebook stories (ephemeral, segments) [future]
exact_mappings:
- as:Object
close_mappings:
- schema:CreativeWork
- crm:E73_Information_Object
related_mappings:
- schema:SocialMediaPosting
- dcterms:BibliographicResource
slots:
# Identification
- post_id
- post_url
# Type classification (MULTIVALUED!)
- post_types
- platform_type
# Authorship
- posted_by_profile
- is_official_content
# Content metadata
- title
- description
- language
- tags
- thumbnail_url
- content_category
# Temporal
- published_at
- updated_at
# Provenance
- retrieval_timestamp
- api_endpoint
- api_version
slot_usage:
post_id:
slot_uri: dcterms:identifier
description: |
Unique identifier for this post.
Format varies by platform:
- YouTube: Video ID (e.g., "dQw4w9WgXcQ")
- Twitter/X: Tweet ID (numeric string)
- Instagram: Media ID or shortcode
Combined with platform type, this uniquely identifies content globally.
range: string
required: true
identifier: true
examples:
- value: "FbIoC-Owy-M"
description: "YouTube video ID"
- value: "1234567890123456789"
description: "Twitter/X tweet ID"
post_url:
slot_uri: schema:url
description: |
Canonical URL to access this post on its native platform.
URL patterns by platform:
- YouTube: https://www.youtube.com/watch?v={video_id}
- Twitter/X: https://x.com/{user}/status/{tweet_id}
- Instagram: https://www.instagram.com/p/{shortcode}
- Mastodon: https://{instance}/@{user}/{post_id}
range: uri
required: true
pattern: "^https?://"
examples:
- value: "https://www.youtube.com/watch?v=FbIoC-Owy-M"
description: "YouTube video URL"
post_types:
slot_uri: dcterms:type
description: |
The type(s) of content in this post.
**MULTIVALUED**: A single post can have multiple types!
Uses SocialMediaPostType class hierarchy for standardized categorization.
**Ordering Convention**:
- First type = primary/dominant format
- Subsequent types = secondary characteristics
**Examples**:
| Post | post_types Value |
|------|------------------|
| YouTube video | [VideoPostType] |
| Instagram carousel | [CarouselPostType, ImagePostType, VideoPostType] |
| Twitter thread | [ThreadPostType, TextPostType, ImagePostType] |
| YouTube Live (archived) | [LiveStreamPostType, VideoPostType] |
| Podcast on YouTube | [AudioPostType, VideoPostType] |
range: SocialMediaPostType
multivalued: true
required: true
inlined: false
examples:
- value: "[VideoPostType]"
description: "Standard video content"
- value: "[CarouselPostType, ImagePostType, VideoPostType]"
description: "Instagram carousel with mixed media"
platform_type:
slot_uri: hc:platformType
description: |
The social media platform where this post was published.
Uses SocialMediaPlatformType class hierarchy.
Distinct from post_types which describes CONTENT format,
platform_type describes WHERE it was posted.
range: SocialMediaPlatformType
required: true
inlined: false
examples:
- value: "YouTube"
description: "Posted on YouTube"
posted_by_profile:
slot_uri: as:attributedTo
description: |
The social media profile (account/channel) that posted this content.
Activity Streams: attributedTo identifies the actor responsible for the content.
Links to SocialMediaProfile which in turn links to the Custodian hub.
range: SocialMediaProfile
required: false
inlined: false
examples:
- value: "https://nde.nl/ontology/hc/social-media/nationaal-onderduikmuseum-youtube"
description: "Museum's YouTube channel profile"
title:
slot_uri: dcterms:title
description: |
Title or headline of the post.
Dublin Core: title for the content's name.
Platform behavior:
- YouTube videos: Video title
- Twitter/X: First line of tweet (or null)
- Instagram: Caption beginning
- Threads: First post text
range: string
required: false
examples:
- value: "De Vrijheidsroute (aflevering 3) Zevenaar, Duiven, Westervoort"
description: "YouTube video title"
description:
slot_uri: dcterms:description
description: |
Full description or body text of the post.
Dublin Core: description for content text.
Platform behavior:
- YouTube: Video description
- Twitter/X: Full tweet text
- Instagram: Full caption
- Thread: Combined text of all posts in thread
range: string
required: false
examples:
- value: "De videoreeks De Vrijheidsroute is gebaseerd op de gelijknamige fietsroute..."
description: "YouTube video description"
published_at:
slot_uri: dcterms:created
description: |
Date/time when post was originally published.
Dublin Core: created for publication timestamp.
ISO 8601 format (e.g., "2025-07-30T18:05:15Z").
range: datetime
required: true
examples:
- value: "2025-07-30T18:05:15Z"
description: "Published July 30, 2025"
updated_at:
slot_uri: dcterms:modified
description: |
Date/time when post was last modified by the author.
Dublin Core: modified for last update timestamp.
May be null if post has never been edited.
range: datetime
required: false
examples:
- value: "2025-08-01T10:30:00Z"
description: "Last edited August 1, 2025"
language:
slot_uri: dcterms:language
description: |
Primary language of the post.
Dublin Core: language for content language.
ISO 639-1 code (e.g., "nl", "en", "de").
range: string
required: false
examples:
- value: "nl"
description: "Dutch language content"
tags:
slot_uri: schema:keywords
description: |
Tags, hashtags, or keywords associated with the post.
Schema.org: keywords for topic classification.
Platform-specific:
- YouTube: Video tags (author-defined)
- Twitter/X: Hashtags
- Instagram: Hashtags from caption
range: string
multivalued: true
required: false
examples:
- value: ["80 jaar vrijheid", "wo2", "vrijheidsroute"]
description: "YouTube video tags"
thumbnail_url:
slot_uri: schema:thumbnailUrl
description: |
URL to a thumbnail/preview image for the post.
Schema.org: thumbnailUrl for preview image.
range: uri
required: false
examples:
- value: "https://i.ytimg.com/vi/FbIoC-Owy-M/hqdefault.jpg"
description: "YouTube video thumbnail"
is_official_content:
slot_uri: hc:isOfficialContent
description: |
Whether this post was published by the heritage institution's official account.
- **true**: Posted by the custodian's verified/official account
- **false**: Third-party content (visitors, media, etc.) about the institution
Helps distinguish official communications from external coverage.
range: boolean
required: false
ifabsent: "true"
examples:
- value: true
description: "Posted by official museum channel"
content_category:
slot_uri: schema:genre
description: |
Category or genre of the post.
Schema.org: genre for content classification.
Platform-specific category systems:
- YouTube: Category ID (e.g., "22" = People & Blogs)
- Instagram: N/A
- TikTok: Category/trend
range: string
required: false
examples:
- value: "22"
description: "YouTube category ID for People & Blogs"
retrieval_timestamp:
slot_uri: prov:atTime
description: |
Timestamp when this post data was retrieved from the platform.
PROV-O: atTime for observation timestamp.
Critical for understanding data freshness, especially for metrics.
range: datetime
required: true
examples:
- value: "2025-12-01T23:16:22.294232+00:00"
description: "Retrieved December 1, 2025"
api_endpoint:
slot_uri: prov:wasGeneratedBy
description: |
The API endpoint or method used to retrieve this post.
PROV-O: wasGeneratedBy for generation method.
Examples:
- "https://www.googleapis.com/youtube/v3"
- "https://api.twitter.com/2/tweets"
- "web_scrape"
range: string
required: false
examples:
- value: "https://www.googleapis.com/youtube/v3"
description: "YouTube Data API v3"
api_version:
slot_uri: schema:softwareVersion
description: |
Version of the API used for retrieval.
Schema.org: softwareVersion for API version tracking.
range: string
required: false
examples:
- value: "v3"
description: "YouTube API version 3"
comments:
- "Concrete class for social media posts"
- "post_types is MULTIVALUED - a post can have multiple content types"
- "First type in post_types list is the primary format"
- "Use specialized subclasses (VideoPost) for platform-specific properties"
- "Activity Streams 2.0 alignment enables ActivityPub federation"
- "Metrics are observational - always include retrieval_timestamp"
see_also:
- "https://www.w3.org/ns/activitystreams#Object"
- "https://schema.org/CreativeWork"
- "https://schema.org/SocialMediaPosting"
# Slot definitions
slots:
post_id:
description: Platform-specific unique identifier for the post
range: string
post_url:
description: Canonical URL to access the post
range: uri
post_types:
description: |
Type(s) of content in this post (MULTIVALUED).
First type is primary format, subsequent types are secondary.
range: SocialMediaPostType
multivalued: true
posted_by_profile:
description: Social media profile that published this post
range: SocialMediaProfile
is_official_content:
description: Whether post is from official institutional account
range: boolean
content_category:
description: Platform-specific category/genre
range: string
retrieval_timestamp:
description: When post data was retrieved
range: datetime
api_endpoint:
description: API used to retrieve post
range: string
api_version:
description: Version of API used
range: string
tags:
description: Keywords/hashtags for the post
range: string
multivalued: true
thumbnail_url:
description: URL to preview/thumbnail image
range: uri

View file

@ -0,0 +1,423 @@
# Social Media Post Type Base Class
# Base class for all social media post/content type classifications
#
# CRITICAL CONCEPTUAL NOTE:
# These classes represent TYPES of social media posts/content.
# They categorize content by format, duration, and platform features.
#
# The SocialMediaPost class uses post_type to reference these types.
# This class hierarchy enables richer semantic modeling of content formats.
#
# DISTINCTION FROM SocialMediaPost:
# - SocialMediaPost: An individual content instance (e.g., a specific YouTube video)
# - SocialMediaPostType: A classification of content formats (e.g., VideoPost, ImagePost)
id: https://nde.nl/ontology/hc/class/SocialMediaPostType
name: social_media_post_type_class
title: Social Media Post Type Base Class
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
dcterms: http://purl.org/dc/terms/
skos: http://www.w3.org/2004/02/skos/core#
as: https://www.w3.org/ns/activitystreams#
wikidata: http://www.wikidata.org/entity/
imports:
- linkml:types
- ../metadata
classes:
SocialMediaPostType:
class_uri: skos:Concept
abstract: true
description: |
Abstract base class for social media post/content type classifications in the heritage domain.
**DEFINITION**:
SocialMediaPostType represents CATEGORIES of social media content,
not individual posts or media items. Each subclass defines characteristics
of a content format (media type, duration, features, platform support, etc.).
**CRITICAL: TYPE vs INSTANCE**
| Aspect | SocialMediaPostType (This Class) | SocialMediaPost (Instance) |
|--------|----------------------------------|---------------------------|
| **Nature** | Content format classification | Individual content item |
| **Examples** | VideoPostType, ImagePostType | A specific YouTube video |
| **Properties** | Duration limits, features, platforms | View count, URL, author |
| **Cardinality** | ~10 content types | Millions of posts |
| **Relationship** | Referenced via `post_types` slot | Can have MULTIPLE types |
**CRITICAL: MULTIVALUED RELATIONSHIP**
A single SocialMediaPost can have **multiple** SocialMediaPostType values!
This is essential because social media content often combines formats:
- A **carousel** contains both images AND videos
- A **thread** combines text posts with attached images
- A **live stream** becomes a standard video when archived
- A **podcast** may also be published as a video recording
**ACTIVITY STREAMS 2.0 ALIGNMENT**:
Social media content types align with W3C Activity Streams 2.0:
- `as:Video` - Video content (YouTube, TikTok, Reels)
- `as:Image` - Image content (Instagram photos, Pinterest pins)
- `as:Note` - Short text content (Tweets, Toots)
- `as:Article` - Long-form content (Blog posts, newsletters)
- `as:Audio` - Audio content (Podcasts, music tracks)
This enables federation with ActivityPub-based platforms (Mastodon, PeerTube).
**HERITAGE INSTITUTION CONTEXT**:
Cultural heritage institutions create diverse content types:
| Content Type | Heritage Use Cases |
|--------------|-------------------|
| **Video** | Virtual tours, conservation demos, interviews, lectures |
| **Image** | Collection highlights, exhibition photos, archival scans |
| **Short Video** | Behind-the-scenes moments, artifact spotlights |
| **Text** | Announcements, event info, research updates |
| **Story** | Ephemeral content for events, openings, daily life |
| **Live Stream** | Exhibition openings, Q&A sessions, guided tours |
| **Audio** | Podcasts about collections, audio guides, oral histories |
| **Thread** | Multi-part narratives, collection deep-dives |
**CATEGORY STRUCTURE**:
Post types are organized into high-level categories:
1. **VIDEO**: Standard video content (YouTube, Vimeo, Facebook Video)
2. **SHORT_VIDEO**: Short-form video (TikTok, Reels, YouTube Shorts)
3. **IMAGE**: Static images (Instagram posts, Pinterest pins, Flickr photos)
4. **TEXT**: Text-based posts (Tweets, Mastodon toots, LinkedIn posts)
5. **STORY**: Ephemeral content (Instagram Stories, Facebook Stories)
6. **LIVE_STREAM**: Real-time video (YouTube Live, Twitch, Instagram Live)
7. **AUDIO**: Audio content (Podcasts, SoundCloud tracks, Spotify)
8. **ARTICLE**: Long-form written content (Medium, Substack, blog posts)
9. **THREAD**: Multi-post sequences (Twitter threads, Mastodon threads)
10. **CAROUSEL**: Multi-image/video posts (Instagram carousels)
**PLATFORM SUPPORT MATRIX**:
| Post Type | YouTube | Instagram | TikTok | X/Twitter | LinkedIn |
|-----------|---------|-----------|--------|-----------|----------|
| Video | Yes | Yes | - | Yes | Yes |
| Short Video | Shorts | Reels | Yes | - | - |
| Image | Thumbnail | Yes | - | Yes | Yes |
| Text | - | Caption | Caption | Yes | Yes |
| Story | - | Yes | - | Fleets* | Stories |
| Live | Yes | Yes | Yes | Spaces* | Live |
*Some features deprecated or limited
**USAGE IN SOCIALMEDIAPOST**:
The SocialMediaPost.post_types slot references these types as a **multivalued** slot:
```yaml
SocialMediaPost:
post_types:
range: SocialMediaPostType # Polymorphic - any subclass
multivalued: true # A post can have MULTIPLE types!
```
**WHY MULTIVALUED?**
A single social media post can legitimately have multiple types:
| Example | Primary Type | Secondary Types |
|---------|--------------|-----------------|
| Instagram carousel with videos | CarouselPostType | ImagePostType, VideoPostType |
| Twitter thread with images | ThreadPostType | TextPostType, ImagePostType |
| YouTube Live archived as video | LiveStreamPostType | VideoPostType |
| Podcast with video recording | AudioPostType | VideoPostType |
| Story highlight (saved) | StoryPostType | ImagePostType, VideoPostType |
**TYPE ORDERING**:
- First type in list = primary/dominant format
- Subsequent types = secondary characteristics
- Order matters for display and categorization
**ONTOLOGY ALIGNMENT**:
- Activity Streams 2.0: W3C standard for social content
- Schema.org: MediaObject, VideoObject, ImageObject
- SKOS Concept: Post types as controlled vocabulary
- Dublin Core: Standard metadata properties
**SUBCLASSES**:
See SocialMediaPostTypes.yaml for concrete post type subclasses:
- VideoPostType: Standard video content
- ShortVideoPostType: Short-form video (TikTok, Reels, Shorts)
- ImagePostType: Photo and image posts
- TextPostType: Text-based posts
- StoryPostType: Ephemeral content
- LiveStreamPostType: Real-time streaming
- AudioPostType: Podcasts and audio content
- ArticlePostType: Long-form written content
- ThreadPostType: Multi-post sequences
- CarouselPostType: Multi-media collections
- OtherPostType: Fallback for emerging formats
exact_mappings:
- skos:Concept
- as:Object
close_mappings:
- schema:MediaObject
slots:
- post_type_id
- post_type_name
- post_type_category
- post_type_description
- post_type_activity_streams_type
- post_type_schema_org_type
- post_type_max_duration
- post_type_ephemeral
- post_type_supported_platforms
- post_type_media_formats
- post_type_heritage_use_cases
slot_usage:
post_type_id:
identifier: true
required: true
description: Unique identifier for this post type
post_type_name:
required: true
description: |
Canonical name for this post type.
Used for display and cross-referencing.
post_type_category:
required: false
description: |
High-level category for grouping related post types.
Values: VIDEO, SHORT_VIDEO, IMAGE, TEXT, STORY, LIVE_STREAM,
AUDIO, ARTICLE, THREAD, CAROUSEL, OTHER
comments:
- "Abstract base class - use specific subclasses (VideoPostType, ImagePostType, etc.)"
- "Represents POST TYPES, not individual content instances"
- "SocialMediaPost.post_type references these type classes"
- "Organized by media format and platform features"
- "Aligned with W3C Activity Streams 2.0 for federation support"
see_also:
- "https://www.w3.org/ns/activitystreams#Object"
- "https://schema.org/MediaObject"
- "https://www.w3.org/TR/activitystreams-vocabulary/"
slots:
post_type_id:
description: Unique identifier for this post type
range: uriorcurie
slot_uri: dcterms:identifier
post_type_name:
description: |
Canonical name for this post type.
Used for display and content categorization.
Examples: "Video", "Short Video", "Image Post", "Story", "Live Stream"
range: string
slot_uri: skos:prefLabel
post_type_category:
description: |
High-level category for grouping related post types.
Enables filtering and analysis by content format.
Values from PostTypeCategoryEnum:
- VIDEO: Standard video content
- SHORT_VIDEO: Short-form video (< 60s typically)
- IMAGE: Photo and image content
- TEXT: Text-based posts
- STORY: Ephemeral content (24-hour visibility)
- LIVE_STREAM: Real-time video
- AUDIO: Audio and podcast content
- ARTICLE: Long-form written content
- THREAD: Multi-post sequences
- CAROUSEL: Multi-media collections
- OTHER: Emerging or uncategorized formats
range: string
slot_uri: skos:broader
post_type_description:
description: |
Detailed description of this post type including purpose,
characteristics, and typical use cases in heritage context.
range: string
slot_uri: skos:definition
post_type_activity_streams_type:
description: |
Corresponding W3C Activity Streams 2.0 type for this post format.
Enables federation with ActivityPub-based platforms.
Common mappings:
- Video → as:Video
- Image → as:Image
- Text → as:Note
- Article → as:Article
- Audio → as:Audio
range: uriorcurie
slot_uri: skos:exactMatch
post_type_schema_org_type:
description: |
Corresponding Schema.org type for this post format.
Enables structured data and SEO optimization.
Common mappings:
- Video → schema:VideoObject
- Image → schema:ImageObject
- Audio → schema:AudioObject
- Article → schema:Article
range: uriorcurie
slot_uri: skos:closeMatch
post_type_max_duration:
description: |
Maximum duration for this content type (if applicable).
Expressed as ISO 8601 duration (e.g., "PT60S" for 60 seconds).
Examples:
- YouTube Shorts: PT60S (60 seconds)
- TikTok: PT10M (10 minutes, extended from 3 min)
- Instagram Reels: PT90S (90 seconds)
- Instagram Stories: PT60S per segment
- Standard YouTube: No practical limit
range: string
slot_uri: schema:duration
post_type_ephemeral:
description: |
Whether this content type is ephemeral (auto-deletes after period).
- Stories: Typically 24 hours
- Fleets (deprecated): Was 24 hours
- Regular posts: Not ephemeral (false)
range: boolean
slot_uri: hc:ephemeral
post_type_supported_platforms:
description: |
Social media platforms that support this content type.
References SocialMediaPlatformType subclasses.
Examples for Short Video:
- YouTube (as Shorts)
- Instagram (as Reels)
- TikTok (native format)
- Facebook (as Reels)
range: string
multivalued: true
slot_uri: schema:availableOnDevice
post_type_media_formats:
description: |
Supported media file formats for this content type.
Examples for Video:
- video/mp4
- video/webm
- video/quicktime
Examples for Image:
- image/jpeg
- image/png
- image/webp
range: string
multivalued: true
slot_uri: schema:encodingFormat
post_type_heritage_use_cases:
description: |
Typical use cases for heritage institutions creating this content type.
Examples for Video:
- Virtual exhibition tours
- Conservation process documentation
- Curator interviews
- Historical documentary content
- Educational lectures
Examples for Short Video:
- Artifact spotlights
- Behind-the-scenes moments
- Quick conservation tips
- Event teasers
range: string
multivalued: true
slot_uri: schema:description
enums:
PostTypeCategoryEnum:
description: High-level categories for social media post type classification
permissible_values:
VIDEO:
description: |
Standard video content with no strict duration limit.
Platforms: YouTube, Vimeo, Facebook Video, LinkedIn Video
Activity Streams: as:Video
Schema.org: schema:VideoObject
SHORT_VIDEO:
description: |
Short-form video content, typically under 60-90 seconds.
Platforms: TikTok, Instagram Reels, YouTube Shorts
Optimized for mobile viewing and algorithmic discovery.
IMAGE:
description: |
Static image content including photos and graphics.
Platforms: Instagram, Pinterest, Flickr, Facebook, X/Twitter
Activity Streams: as:Image
Schema.org: schema:ImageObject
TEXT:
description: |
Text-based posts, typically short-form.
Platforms: X/Twitter, Mastodon, Bluesky, LinkedIn
Activity Streams: as:Note
May include attached media as supplements.
STORY:
description: |
Ephemeral content that auto-deletes (typically 24 hours).
Platforms: Instagram Stories, Facebook Stories, LinkedIn Stories
Often vertical format, designed for mobile.
LIVE_STREAM:
description: |
Real-time video broadcasting.
Platforms: YouTube Live, Instagram Live, Twitch, LinkedIn Live
May be archived as standard video after broadcast.
AUDIO:
description: |
Audio-only content including podcasts and music.
Platforms: Spotify, Apple Podcasts, SoundCloud
Activity Streams: as:Audio
Schema.org: schema:AudioObject
ARTICLE:
description: |
Long-form written content.
Platforms: Medium, Substack, LinkedIn Articles, blogs
Activity Streams: as:Article
Schema.org: schema:Article
THREAD:
description: |
Multi-post sequences forming a narrative.
Platforms: X/Twitter threads, Mastodon threads
Connected series of posts, often numbered.
CAROUSEL:
description: |
Multi-media post with multiple images or videos.
Platforms: Instagram carousels, LinkedIn carousels
Swipeable content collections, up to 10-20 items.
OTHER:
description: |
Emerging or uncategorized content formats.
Use for new platform features not yet classified.

View file

@ -0,0 +1,867 @@
# Social Media Post Types - Concrete Subclasses
# 11 post type subclasses for heritage institution social media content
#
# Part of Heritage Custodian Ontology v0.9.5
# Class hierarchy for semantic modeling of content formats
#
# STRUCTURE:
# - Each subclass inherits from SocialMediaPostType
# - Maps to W3C Activity Streams 2.0 types for federation
# - Maps to Schema.org types for structured data
# - Documents heritage institution use cases
#
# CATEGORIES (11 total):
# - VIDEO (1): VideoPostType
# - SHORT_VIDEO (1): ShortVideoPostType
# - IMAGE (1): ImagePostType
# - TEXT (1): TextPostType
# - STORY (1): StoryPostType
# - LIVE_STREAM (1): LiveStreamPostType
# - AUDIO (1): AudioPostType
# - ARTICLE (1): ArticlePostType
# - THREAD (1): ThreadPostType
# - CAROUSEL (1): CarouselPostType
# - OTHER (1): OtherPostType
#
# TOTAL: 11 post types
id: https://nde.nl/ontology/hc/class/SocialMediaPostTypes
name: social_media_post_types
title: Social Media Post Types Collection
prefixes:
linkml: https://w3id.org/linkml/
hc: https://nde.nl/ontology/hc/
schema: http://schema.org/
dcterms: http://purl.org/dc/terms/
skos: http://www.w3.org/2004/02/skos/core#
as: https://www.w3.org/ns/activitystreams#
wikidata: http://www.wikidata.org/entity/
imports:
- linkml:types
- ../metadata
- ./SocialMediaPostType
classes:
# ============================================================================
# VIDEO CATEGORY
# Standard video content (no strict duration limit)
# ============================================================================
VideoPostType:
is_a: SocialMediaPostType
class_uri: as:Video
description: |
Standard video content with no strict duration limit.
**Activity Streams Mapping**: `as:Video`
**Schema.org Mapping**: `schema:VideoObject`
**Platforms**:
- YouTube (primary)
- Vimeo
- Facebook Video
- LinkedIn Video
- X/Twitter Video
**Duration Characteristics**:
- YouTube: Up to 12 hours (for verified accounts)
- Vimeo: Varies by plan (500MB-unlimited)
- Facebook: Up to 4 hours
- LinkedIn: Up to 10 minutes
**Heritage Use Cases**:
| Use Case | Description | Typical Duration |
|----------|-------------|------------------|
| Virtual tours | 360° or guided exhibition walkthroughs | 10-30 min |
| Conservation | Restoration process documentation | 5-20 min |
| Interviews | Curator, artist, or expert conversations | 15-60 min |
| Lectures | Educational presentations | 30-90 min |
| Documentaries | In-depth collection or history stories | 20-60 min |
| Exhibition intro | Preview of new exhibitions | 2-5 min |
**Technical Properties**:
- Resolution: Up to 8K on YouTube
- Formats: MP4 (H.264), WebM, MOV
- Captions: VTT, SRT supported
- Chapters: Timestamp-based navigation
**Metadata Captured**:
- Duration (ISO 8601)
- Definition (SD, HD, 4K, 8K)
- Caption availability
- View/like/comment counts
- Tags and categories
exact_mappings:
- as:Video
- schema:VideoObject
slot_usage:
post_type_category:
equals_string: VIDEO
post_type_activity_streams_type:
equals_string: as:Video
post_type_schema_org_type:
equals_string: schema:VideoObject
post_type_ephemeral:
equals_expression: "false"
post_type_supported_platforms:
equals_string_in:
- YouTube
- Vimeo
- Facebook
- LinkedIn
- XTwitter
post_type_media_formats:
equals_string_in:
- video/mp4
- video/webm
- video/quicktime
comments:
- "Primary format for heritage institution video content"
- "YouTube most common platform for GLAM sector"
- "Supports captions, chapters, and community features"
- "Long-form content for educational and documentary purposes"
# ============================================================================
# SHORT_VIDEO CATEGORY
# Short-form video content (typically under 60-90 seconds)
# ============================================================================
ShortVideoPostType:
is_a: SocialMediaPostType
class_uri: hc:ShortVideo
description: |
Short-form video content optimized for mobile viewing and discovery.
**Activity Streams Mapping**: `as:Video` (with duration constraint)
**Schema.org Mapping**: `schema:VideoObject`
**Platforms and Duration Limits**:
| Platform | Format Name | Max Duration |
|----------|-------------|--------------|
| TikTok | TikTok | 10 minutes (was 60s, 3min) |
| YouTube | Shorts | 60 seconds |
| Instagram | Reels | 90 seconds |
| Facebook | Reels | 90 seconds |
| Snapchat | Spotlight | 60 seconds |
**Characteristics**:
- Vertical format (9:16 aspect ratio)
- Mobile-first design
- Sound-on experience
- Algorithm-driven discovery
- Looping playback
- Quick, attention-grabbing content
**Heritage Use Cases**:
| Use Case | Description | Example |
|----------|-------------|---------|
| Artifact spotlight | Quick focus on single object | "Object of the Day" |
| Behind-the-scenes | Brief peek at non-public areas | Storage room tour |
| Conservation tip | Quick preservation advice | "How to store photos" |
| Event teaser | Promote upcoming exhibition | Opening night preview |
| Fun facts | Surprising collection stories | "Did you know..." |
| Trending sounds | Participate in viral trends | Museum-themed memes |
**Technical Properties**:
- Resolution: 1080x1920 (vertical)
- Formats: MP4 (H.264)
- Auto-captions: Generated by platforms
- Music/sound: Platform audio libraries
exact_mappings:
- schema:VideoObject
close_mappings:
- as:Video
slot_usage:
post_type_category:
equals_string: SHORT_VIDEO
post_type_activity_streams_type:
equals_string: as:Video
post_type_schema_org_type:
equals_string: schema:VideoObject
post_type_max_duration:
equals_string: PT90S
post_type_ephemeral:
equals_expression: "false"
post_type_supported_platforms:
equals_string_in:
- TikTok
- YouTube
- Instagram
- Facebook
- Snapchat
comments:
- "Fastest-growing content format 2020-2024"
- "Essential for reaching younger audiences"
- "Vertical format (9:16) required"
- "TikTok pioneered format, others followed"
# ============================================================================
# IMAGE CATEGORY
# Static image content including photos and graphics
# ============================================================================
ImagePostType:
is_a: SocialMediaPostType
class_uri: as:Image
description: |
Static image content including photographs, graphics, and artwork scans.
**Activity Streams Mapping**: `as:Image`
**Schema.org Mapping**: `schema:ImageObject`
**Platforms**:
- Instagram (primary image platform)
- Pinterest (discovery and curation)
- Flickr (high-resolution, Creative Commons)
- Facebook
- X/Twitter
- LinkedIn
**Image Specifications by Platform**:
| Platform | Optimal Size | Aspect Ratios |
|----------|--------------|---------------|
| Instagram | 1080x1080 | 1:1, 4:5, 1.91:1 |
| Pinterest | 1000x1500 | 2:3 (vertical) |
| Flickr | Original resolution | Any |
| X/Twitter | 1200x675 | 16:9 |
| Facebook | 1200x630 | 1.91:1 |
**Heritage Use Cases**:
| Use Case | Description | Platform Focus |
|----------|-------------|----------------|
| Collection highlights | Featured artworks/artifacts | Instagram, Pinterest |
| Exhibition photos | Installation and opening shots | All platforms |
| Archival scans | Historical documents and photos | Flickr, Instagram |
| Infographics | Educational visual content | Pinterest, Instagram |
| Before/after | Conservation progress | Instagram, Facebook |
| Detail shots | Close-up of artwork features | Instagram, Flickr |
**Metadata Captured**:
- Dimensions (width, height)
- Alt text / accessibility description
- Location tags
- Object references (linked to collection database)
- Copyright and licensing
exact_mappings:
- as:Image
- schema:ImageObject
slot_usage:
post_type_category:
equals_string: IMAGE
post_type_activity_streams_type:
equals_string: as:Image
post_type_schema_org_type:
equals_string: schema:ImageObject
post_type_ephemeral:
equals_expression: "false"
post_type_supported_platforms:
equals_string_in:
- Instagram
- Pinterest
- Flickr
- Facebook
- XTwitter
- LinkedIn
post_type_media_formats:
equals_string_in:
- image/jpeg
- image/png
- image/webp
- image/gif
comments:
- "Core content type for visual heritage"
- "Instagram dominant for art museums"
- "Pinterest valuable for discovery"
- "Flickr for high-resolution and CC licensing"
# ============================================================================
# TEXT CATEGORY
# Text-based posts (tweets, toots, LinkedIn posts)
# ============================================================================
TextPostType:
is_a: SocialMediaPostType
class_uri: as:Note
description: |
Text-based social media posts, typically short-form.
**Activity Streams Mapping**: `as:Note`
**Schema.org Mapping**: `schema:SocialMediaPosting`
**Platforms and Character Limits**:
| Platform | Character Limit | Notes |
|----------|-----------------|-------|
| X/Twitter | 280 (free), 4000 (premium) | Originally 140 |
| Mastodon | 500 (configurable) | ActivityPub federation |
| Bluesky | 300 | AT Protocol |
| LinkedIn | 3000 | Longer-form text |
| Facebook | 63,206 | Practically unlimited |
| Threads | 500 | Instagram integration |
**Heritage Use Cases**:
| Use Case | Description | Example |
|----------|-------------|---------|
| Announcements | News and updates | "New exhibition opens Friday!" |
| Event reminders | Upcoming activities | "Join us for #AskACurator" |
| Facts and trivia | Collection knowledge | "This painting took 4 years..." |
| Engagement | Questions and polls | "What's your favorite artwork?" |
| Advocacy | Preservation awareness | Heritage at risk alerts |
| Live updates | Real-time event coverage | Conference live-tweeting |
**Characteristics**:
- May include attached media (images, videos)
- Hashtag support for discovery
- Mention/tagging for engagement
- Link previews for URL sharing
exact_mappings:
- as:Note
close_mappings:
- schema:SocialMediaPosting
slot_usage:
post_type_category:
equals_string: TEXT
post_type_activity_streams_type:
equals_string: as:Note
post_type_schema_org_type:
equals_string: schema:SocialMediaPosting
post_type_ephemeral:
equals_expression: "false"
post_type_supported_platforms:
equals_string_in:
- XTwitter
- Mastodon
- Bluesky
- LinkedIn
- Facebook
- Threads
comments:
- "Foundation of social media engagement"
- "Mastodon/Bluesky growing as X alternatives"
- "Often combined with images or links"
- "Hashtags important for heritage campaigns"
# ============================================================================
# STORY CATEGORY
# Ephemeral content (24-hour visibility)
# ============================================================================
StoryPostType:
is_a: SocialMediaPostType
class_uri: hc:Story
description: |
Ephemeral content that auto-deletes after 24 hours (typically).
**Activity Streams Mapping**: `as:Note` (with ephemeral flag)
**Schema.org Mapping**: `schema:SocialMediaPosting`
**Platforms**:
- Instagram Stories (most popular)
- Facebook Stories
- LinkedIn Stories (discontinued 2021)
- Snapchat (original format)
- YouTube Stories (discontinued 2023)
**Characteristics**:
- Vertical format (9:16)
- Auto-delete after 24 hours
- Interactive elements (polls, questions, quizzes)
- Stickers, GIFs, music overlays
- Swipe-up links (for larger accounts)
- Highlights: Saved stories that persist
**Heritage Use Cases**:
| Use Case | Description | Engagement |
|----------|-------------|------------|
| Daily updates | "Today at the museum" | Behind-the-scenes |
| Event coverage | Real-time exhibition opening | Live feeling |
| Polls/quizzes | "Guess the artist" | Interactive |
| Countdowns | Exhibition launch timers | Anticipation |
| Takeovers | Guest curator for a day | Fresh voice |
| Q&A | "Ask a conservator" | Direct engagement |
**Technical Properties**:
- Duration: 15 seconds per segment
- Format: Vertical (1080x1920)
- Can chain multiple segments
- Mentions and hashtags supported
close_mappings:
- as:Note
- schema:SocialMediaPosting
slot_usage:
post_type_category:
equals_string: STORY
post_type_activity_streams_type:
equals_string: as:Note
post_type_max_duration:
equals_string: PT15S
post_type_ephemeral:
equals_expression: "true"
post_type_supported_platforms:
equals_string_in:
- Instagram
- Facebook
- Snapchat
comments:
- "Ephemeral content - auto-deletes after 24 hours"
- "High engagement due to FOMO effect"
- "Highlights feature preserves selected stories"
- "Interactive stickers for engagement"
# ============================================================================
# LIVE_STREAM CATEGORY
# Real-time video broadcasting
# ============================================================================
LiveStreamPostType:
is_a: SocialMediaPostType
class_uri: hc:LiveStream
description: |
Real-time video broadcasting with audience interaction.
**Activity Streams Mapping**: `as:Video` (with live flag)
**Schema.org Mapping**: `schema:VideoObject` (with `isLiveBroadcast: true`)
**Platforms**:
- YouTube Live
- Instagram Live
- Facebook Live
- Twitch
- LinkedIn Live
- TikTok Live
**Characteristics**:
- Real-time broadcasting
- Live chat interaction
- Can be archived as standard video
- Notifications to followers
- Multi-guest capabilities
- Screen sharing (some platforms)
**Heritage Use Cases**:
| Use Case | Description | Interaction |
|----------|-------------|-------------|
| Exhibition openings | Virtual attendance | Live Q&A |
| Curator talks | Gallery walkthroughs | Real-time questions |
| Conservation | Live restoration work | Expert commentary |
| Panel discussions | Multi-speaker events | Audience questions |
| Behind-the-scenes | Storage tours | Exclusive access |
| Collection reveals | New acquisition announcements | First look |
**Post-Broadcast**:
- Most platforms archive as regular video
- Can be edited and republished
- Live chat preserved (some platforms)
close_mappings:
- as:Video
- schema:VideoObject
slot_usage:
post_type_category:
equals_string: LIVE_STREAM
post_type_activity_streams_type:
equals_string: as:Video
post_type_schema_org_type:
equals_string: schema:VideoObject
post_type_ephemeral:
equals_expression: "false"
post_type_supported_platforms:
equals_string_in:
- YouTube
- Instagram
- Facebook
- Twitch
- LinkedIn
- TikTok
comments:
- "Real-time interaction with audience"
- "Often archived as standard video after broadcast"
- "YouTube and Facebook most common for heritage"
- "Twitch for gaming/cultural crossover events"
# ============================================================================
# AUDIO CATEGORY
# Audio content including podcasts
# ============================================================================
AudioPostType:
is_a: SocialMediaPostType
class_uri: as:Audio
description: |
Audio-only content including podcasts, music, and audio guides.
**Activity Streams Mapping**: `as:Audio`
**Schema.org Mapping**: `schema:AudioObject`, `schema:PodcastEpisode`
**Platforms**:
- Spotify (podcasts and music)
- Apple Podcasts
- SoundCloud
- Audible
- Stitcher
- Google Podcasts (discontinued 2024)
**Content Types**:
| Type | Description | Typical Duration |
|------|-------------|------------------|
| Podcast episode | Regular series content | 20-60 min |
| Audio guide | Exhibition companion | 30-90 min |
| Oral history | Recorded interviews | 15-60 min |
| Music/sound art | Audio artworks | Varies |
| Audio description | Accessibility content | Per-item |
**Heritage Use Cases**:
| Use Case | Description | Distribution |
|----------|-------------|--------------|
| Museum podcasts | Collection stories, interviews | Spotify, Apple |
| Audio guides | Self-guided tours | Institutional app |
| Oral histories | Community voice recordings | SoundCloud, archive |
| Accessibility | Description for blind visitors | Institutional |
| Sound archives | Historical recordings | SoundCloud, Spotify |
**Metadata Captured**:
- Duration
- Episode number (for series)
- Show/series name
- Transcript availability
- Guest information
exact_mappings:
- as:Audio
- schema:AudioObject
close_mappings:
- schema:PodcastEpisode
slot_usage:
post_type_category:
equals_string: AUDIO
post_type_activity_streams_type:
equals_string: as:Audio
post_type_schema_org_type:
equals_string: schema:AudioObject
post_type_ephemeral:
equals_expression: "false"
post_type_supported_platforms:
equals_string_in:
- Spotify
- SoundCloud
- ApplePodcasts
- Audible
post_type_media_formats:
equals_string_in:
- audio/mpeg
- audio/mp4
- audio/wav
- audio/ogg
comments:
- "Growing format for heritage storytelling"
- "Podcasts excellent for long-form narratives"
- "Audio guides extend museum experience"
- "Oral histories preserve community voices"
# ============================================================================
# ARTICLE CATEGORY
# Long-form written content
# ============================================================================
ArticlePostType:
is_a: SocialMediaPostType
class_uri: as:Article
description: |
Long-form written content including blog posts and newsletters.
**Activity Streams Mapping**: `as:Article`
**Schema.org Mapping**: `schema:Article`, `schema:BlogPosting`
**Platforms**:
- Medium
- Substack
- LinkedIn Articles
- Institutional blogs
- WordPress
- Ghost
**Characteristics**:
- Long-form text (1000+ words typical)
- Rich formatting (headers, images, embeds)
- SEO optimized
- Newsletter distribution (Substack)
- Comments and responses
- Publication-style layout
**Heritage Use Cases**:
| Use Case | Description | Length |
|----------|-------------|--------|
| Collection deep-dives | In-depth object analysis | 2000-5000 words |
| Research findings | Academic-style writeups | 3000-10000 words |
| Conservation stories | Detailed restoration narratives | 1500-3000 words |
| Exhibition essays | Curatorial perspectives | 2000-4000 words |
| Newsletter updates | Regular subscriber content | 500-1500 words |
| Behind-the-scenes | Long-form narratives | 1000-2000 words |
**Metadata Captured**:
- Reading time
- Word count
- Publication date
- Author/byline
- Tags/topics
- Featured image
exact_mappings:
- as:Article
- schema:Article
close_mappings:
- schema:BlogPosting
slot_usage:
post_type_category:
equals_string: ARTICLE
post_type_activity_streams_type:
equals_string: as:Article
post_type_schema_org_type:
equals_string: schema:Article
post_type_ephemeral:
equals_expression: "false"
post_type_supported_platforms:
equals_string_in:
- Medium
- Substack
- LinkedIn
- WordPress
comments:
- "Best for in-depth heritage storytelling"
- "Medium popular for cultural content"
- "Substack for newsletter-style distribution"
- "LinkedIn Articles for professional audience"
# ============================================================================
# THREAD CATEGORY
# Multi-post sequences
# ============================================================================
ThreadPostType:
is_a: SocialMediaPostType
class_uri: hc:Thread
description: |
Multi-post sequences forming a connected narrative.
**Activity Streams Mapping**: `as:Collection` of `as:Note`
**Schema.org Mapping**: `schema:ItemList` of `schema:SocialMediaPosting`
**Platforms**:
- X/Twitter (threads)
- Mastodon (threads)
- Bluesky (threads)
- Threads by Meta
**Characteristics**:
- Multiple connected posts
- Sequential reading order
- Often numbered (1/10, 2/10, etc.)
- Reply-chain structure
- Can be bookmarked/shared as unit
- "Thread reader" apps for reading
**Heritage Use Cases**:
| Use Case | Description | Typical Length |
|----------|-------------|----------------|
| Object stories | Multi-part artifact narratives | 5-15 posts |
| Exhibition walkthroughs | Room-by-room descriptions | 10-20 posts |
| Historical timelines | Chronological storytelling | 10-30 posts |
| Conservation process | Step-by-step documentation | 5-10 posts |
| Artist biographies | Life story in segments | 10-15 posts |
| Collection highlights | "Top 10" style series | 10-12 posts |
**Engagement Benefits**:
- Higher engagement than single posts
- Encourages following for completion
- Easily shared as complete unit
- Thread unroller tools for reading
close_mappings:
- as:Collection
- schema:ItemList
slot_usage:
post_type_category:
equals_string: THREAD
post_type_activity_streams_type:
equals_string: as:Collection
post_type_ephemeral:
equals_expression: "false"
post_type_supported_platforms:
equals_string_in:
- XTwitter
- Mastodon
- Bluesky
- Threads
comments:
- "Popular format for heritage storytelling"
- "Overcomes character limits creatively"
- "#MuseumWeek and similar campaigns use threads"
- "Thread reader tools compile into articles"
# ============================================================================
# CAROUSEL CATEGORY
# Multi-media collections in single post
# ============================================================================
CarouselPostType:
is_a: SocialMediaPostType
class_uri: hc:Carousel
description: |
Multi-image or multi-video posts in a swipeable format.
**Activity Streams Mapping**: `as:Collection` of `as:Image` / `as:Video`
**Schema.org Mapping**: `schema:ImageGallery`
**Platforms and Limits**:
| Platform | Max Items | Media Types |
|----------|-----------|-------------|
| Instagram | 10 | Images, Videos, Mixed |
| LinkedIn | 20 | Images only |
| Facebook | 10 | Images, Videos |
| X/Twitter | 4 | Images only |
**Characteristics**:
- Swipeable/scrollable format
- Mixed media (images + videos)
- Single caption for all items
- Individual alt text per item
- Higher engagement than single images
**Heritage Use Cases**:
| Use Case | Description | Typical Items |
|----------|-------------|---------------|
| Object details | Multiple angles of artifact | 3-5 images |
| Before/after | Conservation transformation | 2-4 images |
| Exhibition preview | Multiple room shots | 5-10 images |
| Collection series | Related objects grouped | 5-10 images |
| Infographic series | Multi-part educational | 5-10 images |
| Event recap | Photo collection from event | 8-10 images |
**Engagement Benefits**:
- Longer time on post
- Multiple opportunities to engage
- Story-like sequential viewing
- Higher save rates
close_mappings:
- as:Collection
- schema:ImageGallery
slot_usage:
post_type_category:
equals_string: CAROUSEL
post_type_activity_streams_type:
equals_string: as:Collection
post_type_schema_org_type:
equals_string: schema:ImageGallery
post_type_ephemeral:
equals_expression: "false"
post_type_supported_platforms:
equals_string_in:
- Instagram
- LinkedIn
- Facebook
- XTwitter
comments:
- "Excellent for detailed collection storytelling"
- "Instagram carousels have highest engagement"
- "Good for before/after conservation"
- "LinkedIn carousels popular for professional content"
# ============================================================================
# OTHER CATEGORY
# Fallback for emerging formats
# ============================================================================
OtherPostType:
is_a: SocialMediaPostType
class_uri: as:Object
description: |
Fallback type for emerging or uncategorized content formats.
**Activity Streams Mapping**: `as:Object` (generic)
**Schema.org Mapping**: `schema:MediaObject`
**Use Cases**:
- New platform features not yet classified
- Experimental content formats
- Platform-specific content without standard mapping
- Mixed or hybrid formats
**Examples of Emerging Formats**:
- AR/VR experiences
- Interactive polls as standalone content
- NFT-linked content
- AI-generated content
- 360° photos
- Spatial audio
**When to Use**:
Use OtherPostType when content doesn't fit existing categories.
Document the specific format in post description for future
classification review.
close_mappings:
- as:Object
- schema:MediaObject
slot_usage:
post_type_category:
equals_string: OTHER
post_type_activity_streams_type:
equals_string: as:Object
post_type_schema_org_type:
equals_string: schema:MediaObject
post_type_ephemeral:
equals_expression: "false"
comments:
- "Fallback for content not matching other types"
- "Document specific format for future classification"
- "Review periodically for new category creation"
- "Use sparingly - prefer specific types when possible"