A person tag (AKA people tag) is a tag on a post that refers to a specific person by URL, and which the post author explicitly adds as a tagging action, beyond just mentioning a person via hyperlink, h-card, or @-name (autocompleted or not).
A person mention is a reference to a person by homepage URL, but it is not explicitly a tagging action. All person tags are person mentions, but not all person mentions are person tags.
Here was a simple real world example of a note that's been person-tagged:
- 1 Example
- 2 Why
- 3 How to
- 4 IndieWeb Examples
- 5 Tool Support
- 6 IndieWeb Interest
- 7 Silo Examples
- 8 Brainstorming
- 8.1 Rethinking tagging and untagging user flow
- 8.2 Plain text authoring
- 8.3 Plain text presentation
- 8.4 Basic Person Tagging example
- 8.5 HTML imagemaps
- 9 FAQ
- 10 SWAT0
- 11 Sessions
- 12 See Also
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 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:
… 👤 <a class="u-category h-card" href="https://snarfed.org/">Ryan Barrett</a> <a class="u-category h-card" href="http://tantek.com/">Tantek Çelik</a> …
That will tag the current h-entry as being about Ryan Barrett of snarfed.org and Tantek Çelik of tantek.com.
If the current h-entry has a "u-tag-of" link to another post, then it is a tag-reply that tags that other post as being about those people.
(Optionally) With other profiles
You can also provide links to a person's (multiple) other profiles to their person-tag h-card:
👤 <span class="u-category h-card"> <a class="u-url p-name" href="http://tantek.com/">Tantek Çelik</a> (<a class="u-url" href="https://twitter.com/t">t</a>, <a class="u-url" href="https://www.facebook.com/tantek.celik">f</a>) </span>
Where the parenthetical (t, f) could/should be equivalent social media icons for Twitter and Facebook without parentheses. E.g.:
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
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.
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
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.
- subsequently Ben used his person-tagging support in MobilePub to be player A in passing SWAT0 at IndieWebCamp 2015.
Kyle Mahan added support for person tags to Red Wind on 2015-11-17, where any person in the contact list can be tagged:
- 2015-11-18 photo: Celebrating Homebrew Website Club’s 2nd anniversary.
- as such used his manual person-tagging to be player A, one of two indieweb players, in passing Silo SWAT0 at Homebrew Website Club SF 2015-11-18!
Using two person-tags each with multiple other profiles.
- 2015-12-05 photo: W3C Social Web Working Group meeting
- 2016-06-02 photo: Homebrew Website Club SF. See screenshot of person-tags display in post-footer:
- FB POSSE copy:
Ashton McAllan added person-tag receiving to her WordPress:
- person-tags, though sent to the homepage, are shown on the about page
- blogroll entries have a json object stored in wordpress's "notes" field for the record.
- something like
- Quickposse just checks to see if an @persontag has a matching blogroll entry and, if everything exists, looks in the json object to see if it has a property for the posse destination
j4y_funabashi can add person-tags to any post by adding a category of @persons-url
- Currently I only show the url I enter as the category but I plan to do some sort of lookup to fetch the person's name as well
- first note with person-tags http://j4y.co/p/20160621170659_576966231afbb
Sebastiaan Andeweg added support for autolinking
@someone as a mention, and soon after added autolinking
+someone to person-tag that person (the same link, but with
class="u-category h-card" on it.)
gRegor Morrill manually added a person-tag to a post on 2017-12-13: https://gregorlove.com/2017/12/immediately-thought-of-tantek/
Jamie Tanna adds a person tag for a FQDN
@www.jvt.me and is platform aware (as per https://www.jvt.me/posts/2020/03/22/at-mention-people/) so will syndicate the Twitter username when POSSE'ing to Twitter if it is known by Jamie' site.
Example of note https://www.jvt.me/mf2/2020/03/g1mpf/ and syndicated Tweet https://twitter.com/JamieTanna/status/1241776653124149253
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.
The micropub client MobilePub has an interface for supporting person-tags on a post.
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 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
- 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/facebookUserIDlink 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)
- Twitter person-tag support
Kyle MahanKyle Mahan:
I'm interested in having "in this photo: list of names" type tags, but not so much tagging x/y coordinates
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. I don't want people to be left out.
ĎÚβĨŐÚŚ 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.
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.
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.
- 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 - photos in tweets can be people-tagged - see details.
- Google+ - photos can be people-tagged - see details.
- Foursquare - you can tage people in checkins
A person tag in stream view:
A person tag on the tweet permalink: (URL?)
Multiple person tags in permalink view from
- one "photo" (separate apparent photos were stitched together manually)
- three person-tags
👤 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.
There is currently (2015-11-05) no API support for posting person tags on photos to Twitter.
- See: https://github.com/snarfed/bridgy/issues/459#issuecomment-154229985 for details and more links
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.
Rethinking tagging and untagging user flow
Existing person-tagging systems allow people to tag others in their photos typically without prior permission or even interaction which presumes good behavior and puts the burden of handling and undoing misbehavior on those who may be harmed by the tagging.
We should rethink the user flow of person-tagging to instead design for default respect and safety, putting more burden on the folks doing the person-tagging than the folks who may be errantly mistagged.
Silos like Flickr, Facebook, Instagram, and Twitter all have the ability to tag people in photos by default, and then present the person that is tagged with the option of untagging themselves. People can opt-out of being person-tagged, but that's not necessarily ideal as a default. Some(which?) have defaults that only allow person-tagging of people who have designated you as a friend, which again might be too much of a bundling of a permission with the expression of a relationship.
This current state of this user flow is something like:
- A tags B in a photo
- B is notified that they’ve been tagged
- B can tap that notification or view their notifications and tap the entry to view it
- B when viewing the photo, B can see that they’ve been tagged in it and has the option to untag themselves,
- B can optionally also block A so they cannot person-tag B in the future
- A posts a photo
- C sees that post in their reader
- C recognizes B and tags B in the photo
- B receives a notification and can view the photo, untag themselves etc. just like before
- B can optionally also block C so they cannot person-tag B in the future
These default user flows generally assume good relationships and behavior among A,B,C and only handle misbehaviors after the fact, putting the burden on B to undo or repair the situation.
Instead we should rethink this entire flow in terms of respect, safety, and consent, and design a new suggested user flow accordingly, using that to drive any new protocol interactions that may be needed.
One model to consider is a
- grant permission to allow tagging of yourself
- ok to be tagged by anyone or even by friends
- ask permission to tag someone
Dopplr had a model for "friending" like this. You would:
- grant permission to allow viewing of content
Specifically instead of requesting to follow protected content (e.g. Twitter, Instagram). In the example of Dopplr, that protected content was your upcoming travel plans. And there was no "request to follow".
Additional considerations / concerns:
- unintentionally helping facial recognition algorithms
- tagging people in protest having harmful consequences
... continue brainstorming here, including what a step-by-step interaction could look like ...
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)
- '#' - 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"
#tantek.comas plain text shorthand to mean explicitly (person)-tag with "tantek.com"
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:
- tantek.com -> imply http -> http://tantek.com/
- @t -> assume Twitter @-names -> https://twitter.com/t
- Facebook/tantek.celik -> assume ".com" domain for a string with "/" (a path) -> http://facebook.com/tantek.celik -> whitelist https upgrade -> https://facebook.com/tantek.celik
- Or fb/ or f/ possibly?
For Facebook pages, consuming code may require the page id instead, that is, go from:
- view source (not logged in)
<meta property="al:android:url" content="fb://page/..."
- ... -> 22092443056
- -> linking to Facebook.com/22092443056
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.
What if person has no domain? Then:
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.comIn 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
- 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 CASSIS
auto_person_tagfunction (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.
- 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)
auto_person_tagto 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.
👤 <a class="u-category h-card" href="URL">name</a> ...
That should be enough for:
- people seeing a post that it's person tagged
- Bridgy to pick it up to POSSE person-tags to Facebook
- but does nothing for Twitter POSSE copy (yet)
- incrementally figure that out later
- document simplest thing I could do to plain-text person-tag it
- When auto-linking a URL, delete the # character before it
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
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
On systems which auto-link the text, it's slightly nicer to provide the people's domain names as well.
👤 Person1givenname (p1.example.com), Person2givenname (p2.example.net), and Person3givenname (p3.example.org)
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.
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 link after 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.
Related Bridgy Publish feature request:
- photo post to Twitter POSSE person-tag(s) as tweet text: https://github.com/snarfed/bridgy/issues/547
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.
Selfie with #p1.example.com #@exampleperson
Selfie with 👤 p1.example.com @exampleperson
with many more:
Selfie with #@exampleperson #p2.example.net #@exampleorg #p4.example.edu
Selfie with 👤 @exampleperson p2.example.net @exampleorg p4.example.edu
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).
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
To suggest person-tags in someone else’s photo, post a person tag reply
- As explained: tag-reply#person_tag_reply
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:
<img src="some_photo.jpg" alt="Tantek, Aaron and Amber!" usemap="#peeps" class="u-photo">
<area shape="circle" coords="124,58,8" class="microcard h-card u-url" href="http://tantek.com" alt="Tantek Çelik">
<area shape="rect" coords="0,0,82,126" class="microcard h-card u-url" href="http://aaronparecki.com" alt="Aaron Parecki">
<area shape="circle" coords="90,58,3" class="microcard h-card u-url" href="http://caseorganic.com" alt="Amber Case">
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
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.
People tagging was one of the steps of the SWAT0 social web acid test developed / proposed in 2010.
Person tagging was discussed at (at least) these IndieWebCamp sessions: