person-tag

A person tag (AKA people tag) is a person mention that is also a tag on a post that refers to a specific person by URL rather than just a word or phrase, and is done as an explicit tagging action by the user, beyond just mentioning a person via hyperlink / h-card / or @-name, autocompleted or not.

Why

By supporting people tags in posts, you can more explicitly/automatically notify people via webmention to their homepage at their URL that you have explicitly tagged a post as being about them, e.g. a photo post where they're in the photo.

How to

How to markup

You can tag a post with a person-tags (as opposed to just a plain text tag) by using an h-card for the p-category element inside an h-entry, e.g. from the example above, here is markup just for the person-tags:

This method of marking up person-tags is useful for a couple of reasons:

Person-tagging people without their own websites

Providing silo profile URLs for the silos you want to POSSE to, e.g. using a service like Bridgy.

TIP: You should only provide links to a person's (multiple) other profiles that they themselves link to from their personal site (or possibly if their known public other profile (e.g. Twitter) links to their personal site) or if their site and other profiles are linked from a reputable public source like Wikipedia. E.g. if a person does not link from their personal site to their Facebook profile, you should not link to them as if they are the same person.

How to parse

If you receive a webmention to your homepage, how do you know, that the intent was to tell you that you were tagged in a post?

You parse the "u-category" on the link to your site to see that that link is "tag" of the containing h-entry.

That is, when you verify the webmention, if you see that the link to you is on a u-category inside an h-entry, that means you have been person-tagged in that h-entry.

IndieWeb Examples

Kevin Marks

Kevin Marks has person-tags on his notes from Homebrew Website Club 2014-11-19 (posted on that date). First known real-world use of publishing proposed person-tags using then proposed markup of class='h-card p-category'

Thanks to webmention.herokuapp.com person tags to kevinmarks.com show up on his homepage as comments. bridgy echoing back twitter @ mentions make up most of these.

Ben Roberts

Ben Roberts has person-tags on his site using Postly since 2015-04-30. This is done through any micropub endpoint simply entering a URL as a category. The micropub endpoint fetches the URL to check for an h-card and, if available, will tag with the name and url extracted from that h-card. Support for receiving tags and being tagged added on 2015-05-03.

gRegor Morrill

Tool Support

Noterlive

Noterlive generates person-tags by default by in the HTML markup using first proposed markup of class='h-card p-category', so anyone else who uses Noterlive will get them too. Examples:

Kevin Marks uses Noterlive on www.kevinmarks.com to publish collections of live tweets.

...

Mobilepub

The micropub client MobilePub has an interface for supporting person-tags on a post.

OwnYourGram

OwnYourGram translates person-tags on Instagram (of their @-names) into person-tags of people's personal sites (assuming they link them on their IG profiles), when posting to your site via micropub.

OwnYourSwarm

OwnYourSwarm translates person-tags of Swarm users into a person-tag of that person's personal website if they also use OwnYourSwarm. (Swarm doesn't provide a "website" field in profiles). See https://ownyourswarm.p3k.io/docs

Bridgy Publish

Bridgy Publish consumes (parses) person-tags from your original post, and cross-posts them in POSSE copies to at least Facebook and Flickr.

Details:

Facebook person-tags work in one of two ways

Original post has a person-tag of an indieweb site who has signed up for Bridgy themselves with their Facebook profile (and thus connected the two)

Person-tag includes an explicit facebook.com/facebookUserID link where facebookUserID is the numerical id of the person being person-tagged (available in the source of their profile in an invisible fb://facebook.com/facebookUserID)

IndieWeb Interest

Kyle Mahan

I'm interested in having "in this photo: list of names" type tags, but not so much tagging x/y coordinates

Tantek

Tantek Çelik I am interested in helping solve this problem to escape the "50 person-tags limit" in Facebook photos (as documented below in #Silo_Examples). A group I am involved with posts group photos every week with more than 50 people and people get left out because of this limitation[2]. I don't want people to be left out.

Ben Roberts

Ben Roberts I am interested in being able to tag people with co-ordinates as well. I am working on adding the code needed to have a test implementation soon based on Tantek's ideas in the chat

The Dod

ĎÚβĨŐÚŚ Dod Personally, I find tagging to be a dangerous habbit (especially today, when face recognition is becoming more and more available to governments and more common criminals). I may be old fashioned, but I believe that any person-tagging protocol should involve consent or "moderation" by the person being tagged. The protocol should require some way of privately informing the tag's target that there's a photo (perhaps of something that "happened in Vegas") and the target should confirm to the source (e.g. via clicking a link and posting a form with the picture and a "This is me and you can publish that this is me" checkbox).
If it didn't happen (or if there's no way to reach the target), it should be considered bad manners to publish such a tag. At least IMHO.

rhiaro

Amy Guy I agree that telling the world 'this person is here', eg. in a photo, checkin, article about someone should certainly have some kind of consent - the tagged person is alerted and can say yes or no to the tag being published with the post. Maybe just by rejecting a webmention.

Silo Examples

The following silos support people tagging and are thus a good starting point for documenting people-tagging user experiences for recreation on indieweb sites.

Facebook - all post types, an explicit text mention is interpreted as a people tag, plus you can explicitly people tag areas of photo posts. Limitation: you can only tag up to 50 people in a photo on Facebook.[3]

Flickr - you can people tag a photo and optionally denote a rectangle of the photo that indicates that person.

Instagram - you can people tag a photo and optionally denote a point on the photo (from which the label of the person's name is hung).

Twitter

one "photo" (separate apparent photos were stitched together manually)

three person-tags

... excerpted for fair use ...

👤 Jenn, Shaluinn and Heather Stephens

Note lack of Oxford comma, likely explicit but a design error on Twitter’s part

Lack of Oxford comma makes the latter two people errantly appear to be siblings, since second only has a given name, and third has both given and surnames. This is a good concrete example of why an algorithmic situation (such as a list of three people) should always automatically use an Oxford comma.

Twitter limitations

There is currently (2015-11-05) no API support for posting person tags on photos to Twitter.

Swarm

When writing a description/shout on a Swarm checkin, if you start typing the name of a person, the Foursquare app Swarm will pop-up a UI to pick from friend's names matching what you've typed, which you can pick, or dismiss and keep typing text.

If you pick someone from that person-choose UI, Swarm adds a person-mention with orange background inline in your comment, AND adds a person tag in a little mini-face-pile at the bottom just above the (Cancel) (Checkin) buttons. The person-mentions are uneditable but each deletable as a whole name. If you delete a person-mention inline in the content, the respective person-tag icon below is also removed.

Each person-tag icon has a little orange circle with white x on its lower right quadrant, and clicking that will remove the person-tag (but leave the person-mention intact).

After the checkin is created, the person-mention still appears inline with the checkin note.

Brainstorming

Plain text authoring

A key challenge for person-tagging is how to easily enter person-tags in a simple text-only UI (e.g. SMS, email, HTML textarea etc.)

Here are some thoughts on how to do plain text authoring in a repeatable, memorable, understandable, and human-editable way. - Tantek 18:10, 15 November 2015 (PST)

hashpersontags

'#' - is now known as the method by which to explicitly tag something (hashtag) with a term, above and beyond merely mentioning that term.

person-tags are basically URLs that represent people

if you merely link to someone e.g. "tantek.com" in text content, you are only mentioning them, you are not explicitly tagging them

it makes sense to try re-using the '#' prefix to mean "explicitly tag with this"

multi-profile person-tags

Until we can depend on publishing and consuming systems having rel-me caches (lazily grown) in general, publishers may want to explicitly publish multiple URLs per person. The u-category + h-card markup allows for this already, yet it would be nice to also have a plain text authoring solution that has a reasonably legible / re-editable fallback.

Here are some ideas for plain text authoring for people and orgs/pages:

#tantek.com(@t, Facebook/tantek.celik)

#starbucks.com(@starbucks, Facebook/Starbucks)

These would of course be turned into h-cards with u-url properties for each profile, using auto_link algorithms like:

Q: How can consuming code tell the difference between a person and an org from such a hand-authored "person-tag"? Does it matter?

A: For some org references, consuming code can automatically determine that it's an org:

own domain: if the domain's representative h-card is an "org" h-card (that is "p-org" property == "p-name" property), then it's an org

Facebook: if there's content="fb://page/ per the above notes, that presence of "page" means it's an org, not a person (which would have "profile" there instead").

Twitter: if the Twitter profile has a URL, then apply "own domain" test above.

silo only person-tags

What if person has no domain? Then:

Twitter

#@t

Facebook

#Facebook/tantek.celik

Both

#@t(Facebook/tantek.celik)

In each of these cases, a nicknamescache could be used to auto-expand the parenthetical portion (of additional identities for person-tag (semi-)supporting silo destinations), as well as change a Twitter person-tag into one that is indieweb-primary with their Twitter profile inside the parentheses.

in content vs separate UI

There are two general approaches to authoring person-tags:

Enter the hashpersontag as described above inline in text content like:

Selfie with #p1.example.com

In this case this should be stored as is in the content source, and the person-tag markup for p1.example.com should be automatically generated, in the h-entry, outside the e-content. When auto-linked and presented on the web, the # should be removed, and the person tags should be collected and displayed at the end e.g.:

Selfie with p1.example.com👤 p1.example.com

A separate UI for authoring person-tags, at a minimum a field, perhaps re-use an existing separate "tags" field, where you can author plain text person-tags just as the above. In this case this plain text set of tags could be stored directly in a separate property of the h-entry, like say p-x-user-tags, which was then used to automatically generate person-tag markup when presented on the web.

minimal separate field UI

Given the increased complexity of implementing proper tweet text for inline content person-tags (option 1 above), it makes sense to first try implementing a separate UI first (as a text input field), since that should be simpler (less code to build a reasonably usable feature).

An implementation strategy (if this is too specific for person-tag brainstorming I can move to Falcon page)

UI: input field that maps 1:1 into content storage, e.g.

storage: perhaps a "p-x-user-tags" property inside the "h-entry", a space separated set of plain-text person-tags, no need for # prefix.

new CASSISauto_person_tag function (takes string text to markup, and eventually an optional additional h-card contacts structure using jf2) that:

apply auto_link RE to discover them all

create u-category h-card tags automatically

anything non-just-space intervening:

if trim(intervening) == '(' then
repeat: parse alternate profiles
collect next link into alternates
if next text == ')' then exit repeat
else if next text != whitespace then collect as name
continue repeat
end repeat
else if char 1 of intervening is alphanum,
if first word is "facebook/" or "fb/" create facebook.com person-tag
else create plain p-category tag for it.
end if
look up indieweb site, name in h-card contacts (if provided)
if not found, synthesize name:
if twitter, use @-name literally
else if FB, use "Facebook/alias" as name
else if has path, use "site(-com)/path" as name
else use indie domain as name
end if

auto-suggest separate field UI

In addition to the above minimal separate field UI:

While you're typing, the code should check what you type with your nicknames-cache, and suggest matching names.

Advantages:

less typing for the user to type person-tag names

nicknames cache can provide URL and other profiles for a chosen name

person tag presentation

presentation: in code that generates markup for a post

retrieve user-tags from storage (or already have it retrieved when storage was loaded)

use auto_person_tag to turn storage user-tags into HTML markup for output

prepend with "👤 " and append to output HTML for the post

Person-tag presentation should be outside e-content but before before web actions buttons.

Plain text presentation

Since person-tags have a specific semantic above and beyond the plain text content of a post, and frankly there's no "#" equivalent for explicit-person tags (@-mention already means, mention, not tag), it makes sense to design a way of presenting person-tags that is distinct from the plain text content, and (likely) different from what is easiest to type!

Each of these brainstorms/examples is expected to be put on its own line, with a line-break before and/or after as needed if there is anything before or after respectively.

plain plain text

Most minimally, e.g. SMS, you would want something that is fully readable and ASCII-ish (no emoji). Thus:

With: Person1givenname Person2givenname Person3givenname

If space (character count) is not an issue, then use full names and punctuation like:

With: Person Name1, Person Name2, and Person Name3

plainish text

Many modern systems / devices support Unicode sufficiently to support emoji as well, thus for those you could instead do:

👤 Person1givenname Person2givenname Person3givenname

again with more punctuation & content:

👤 Person Name1, Person Name2, and Person Name3

auto-linked text

On systems which auto-link the text, it's slightly nicer to provide the people's domain names as well.

Adding a parenthetical domain name after the person's name requires using commas to visually cluster names and domains, and it's assumed that that's friendlier than *only* providing domain names like:

👤 p1.example.com p2.example.net p3.example.net

Which is still another option if someone wishes to experiment with it.

tweet text

On Twitter we can do better for local users than use so much space with full names and domain names, and that is to use people's @-names instead (where available), and perhaps fallback to their plain domain names where they don't. E.g. if Person1 and Person3 have Twitter handles but Person2 does not:

👤 @exampleperson p2.example.net @exampleorg

Alternatively if Person2 does not have a domain then simply use their given name.

👤 @exampleperson Person2givenname @exampleorg

If there are more than three person-tags, I think it is best to use a "summary" approach like seen in summaries of person-tag lists on Facebook etc. For such summaries on Twitter it makes sense to give @-names preferential treatment over indieweb domains over people lacking both.

E.g. if you had four person tags by following the above algorithm:

👤 @exampleperson p2.example.net @exampleorg p4.example.edu

You could abbreviate for Twitter like Facebook does in person-tag presentation summaries ("and n others")

👤 @exampleperson @exampleorg and 2 others

However tweets are not editable, whereas Facebook posts are, and thus presuming this is for POSSE purposes, it may make sense to omit the number, expecting that your post may acquire additional tags (typical, especially for photo posts) over time:

👤 @exampleperson @exampleorg and others

The phrase "and others" feels a bit awkward though without the number, perhaps due to seeing it too often with a number. Alternatively we could use the word "more" an ellpsis "…" or both "more …"

👤 @exampleperson @exampleorg and more

👤 @exampleperson @exampleorg …

👤 @exampleperson @exampleorg and more …

Of those options, I believe the shortest makes sense contextually on Twitter, thus:

👤 @exampleperson @exampleorg …

This keeps it nice and short and devoid of noisy punctuation when possible (all good things on Twitter's tweet-length limited medium).

With any of these summarizing methods, it makes sense to include the original post linkafter the person-tag text, as people are used to seeing a way to get to the "more" or "…" information either by it being directly linked, or a visible (preferably linked) URL immediately following it. Thus

👤 @exampleperson @exampleorg … (author.example.com/original-post)

Where "author.example.com/original-post" is what is displayed in the text, yet it is fully hyperlinked to the original, that is, Twitter's normal behavior for hyperlinks in the plain text content.

tweet inline person-tags

If an author can enter person-tags (e.g. per above "#" proposal) inline in content, there are additional considerations for the tweet text.

When POSSEing to Twitter, it makes sense to indicate inline person-tags (e.g. with a 👤), and then not list those in the explicit list but rather provide a hint that some tags were already present in the content text, e.g. simple case:

Selfie with 👤 p1.example.com

with more than one in a row, omit intervening 👤 as it's obvious from context.

Note that none of these examples include a separate line (near the bottom) starting with "👤" because all the person-tags are indicated inline (since they were authored that way).

Using + as autolink

Instead of the syntax #@someone, the syntax +someone can also be used while autolinking. The plus-symbol resembles the "with" part of a person-tag: you explicitly say is with someone. (Silo's like Swarm or Facebook will also add that plain text "— with Someone" at the end of a post.)

Basic Person Tagging example

HTML imagemaps

Summary: HTML area tags could be used to area-person-tag people in photos, and could be parsed via mf2, however they lack a good/obvious mapping to micropub, which makes this approach problematic. Archived here for documentation purposes.

Ben Werdmuller wondered if you could tag people in photos by linking to their profiles using HTML imagemaps (!) and marking up the imagemap links with microformats. That might look something like:

However, because the HTML syntax of imagemaps sits outside the actual image tag, it may be worth adding a microformat to the map itself.

While this would work, and the parsing algorithm for Microformats2 could add area tag support, the problem I hit was in mapping this in to micropub. There are no fields to define coords or shape that would really fit. It is essentially a set of embedded objects which micropub tries to avoid - Ben Roberts

FAQ

Should Twitter links be person-tags

Q: Should twitter handle links be person tags?

A: No. Tagging a person is different from mentioning them. Twitter @-mentions are not person-tags by default; absent any other information they are merely @-mentions, mentions as it were, not tags.[4][5]

SWAT0

People tagging was one of the steps of the SWAT0 social web acid test developed / proposed in 2010.