GitSocial is a social networking extension for the GitMsg protocol.
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.
Message types:
post: Standard messagecomment: Response to contentrepost: Share without commentaryquote: Share with commentaryA commit without a GitMsg: trailer is a post. A post requires a trailer only when it uses a field (e.g., edits, retracted, origin fields).
Subject line requirements:
# <Author Name> @ <owner>/<repo>: <excerpt> (remote) or # <Author Name>: <excerpt> (local)GitMsg: trailer fields:
original: Reference to original content being commented on, reposted, or quotedreply-to: Reference to parent comment in nested discussionsField order: reply-to, then original.
A thread is a post and the comments whose original references it.
Reference structure requirements:
original field MUST reference the thread's first post, not intermediate commentsreply-to (parent comment) and original (first post) fieldsoriginal fieldMessages MAY be edited or retracted using core versioning (GITMSG.md 1.5).
Lists define repositories to follow. Posts from repositories in lists appear in the timeline.
Repository entries use <url>#branch:<branch> format. #branch:* follows all branches (see GITMSG.md 2.1).
For each entry, implementations MUST read the named branch and the repository's gitmsg/social branch. On those branches, a commit without a GitMsg: trailer is a post, and a commit with a GitMsg: trailer whose ext is social is a social message.
Configuration is stored at refs/gitmsg/social/config:
{
"version": "0.1.0"
}
Configuration MUST include: version.
{
"name": "social",
"version": "0.1.0",
"display": "GitSocial",
"description": "Social networking extension for GitMsg",
"types": ["post", "comment", "repost", "quote"],
"fields": ["original", "reply-to"]
}
Hello world!
Great idea!
GitMsg: ext="social"; type="comment"; original="https://github.com/user/repo#commit:abc123456789@main"; v="0.1.0"
GitMsg-Ref: ext="social"; type="post"; author="Alice"; email="[email protected]"; time="2025-01-06T10:30:00Z"; ref="https://github.com/user/repo#commit:abc123456789@main"; v="0.1.0"
> Original post content
I agree!
GitMsg: ext="social"; type="comment"; reply-to="#commit:def456789abc@main"; original="#commit:abc123456789@main"; v="0.1.0"
GitMsg-Ref: ext="social"; type="comment"; author="Bob"; email="[email protected]"; time="2025-01-06T11:00:00Z"; ref="#commit:def456789abc@main"; v="0.1.0"
> Parent comment
GitMsg-Ref: ext="social"; type="post"; author="Alice"; email="[email protected]"; time="2025-01-06T10:30:00Z"; ref="#commit:abc123456789@main"; v="0.1.0"
> Original post
# Alice @ user/repo: Original content excerpt
GitMsg: ext="social"; type="repost"; original="https://github.com/user/repo#commit:abc123456789@main"; v="0.1.0"
GitMsg-Ref: ext="social"; type="post"; author="Alice"; email="[email protected]"; time="2025-01-06T10:30:00Z"; ref="https://github.com/user/repo#commit:abc123456789@main"; v="0.1.0"
> Original content
Hello world! (updated)
GitMsg: ext="social"; type="post"; edits="#commit:abc123456789@main"; v="0.1.0"
GitMsg: ext="social"; edits="#commit:abc123456789@main"; retracted="true"; v="0.1.0"
Great idea! I especially like the part about...
GitMsg: ext="social"; type="comment"; edits="#commit:def456789abc@main"; original="#commit:abc123456789@main"; v="0.1.0"
GitMsg-Ref: ext="social"; type="post"; author="Alice"; email="[email protected]"; time="2025-01-06T10:30:00Z"; ref="#commit:abc123456789@main"; v="0.1.0"
> Original post content