From IndieWeb
(Redirected from person-tags)

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 past real world example of a note that's been person-tagged:

Kyle Mahan
Demoing person tags with
👤 Ryan Barrett Tantek Çelik
December 3, 2015 9:42am PST


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-tag (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="">Ryan Barrett</a>
<a class="u-category h-card" 
   href="">Tantek Çelik</a>

That will tag the current h-entry as being about Ryan Barrett of and Tantek Çelik of

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="">Tantek Çelik</a> 
  (<a class="u-url" 
   <a class="u-url" 

👤Tantek Çelik (t, f)

Where the parenthetical (t, f) could/should be equivalent social media icons for Twitter and Facebook without parentheses. E.g.:

👤Tantek Çelik favicon? favicon?

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

  1. Person-tagging people without their own websites
  2. 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'

More recent examples have hovercards support added for example indiewebcamp sf 2015 - this is done dynamically using a js script calling unmung's hovercard endpoint.

Thanks to person tags to 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.


Jeena Paradies has person-tags on his photos from Homebrew Website Club 2015-07-29

Ryan Barrett

Ryan Barrett adds person-tag markup manually to some of his WordPress posts since 2015-11-18, e.g.

Bryn Wolf

Bryn Wölfka posts short notes with person-tags on her WordPress blog since 2015-12-03, e.g.

Using two person-tags each with multiple other profiles.


Tantek Çelik occasionally posted photos with person-tags on using Falcon since 2015-12-05, e.g.:

Ashton McAllan

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
    {'twitter':'@t','tumblr':'<a href="">tantek</a>'}
  • 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

Jay Robinson

j4y_funabashi can add person-tags to any post by adding a category of @persons-url

Sebastiaan Andeweg

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

gRegor Morrill manually added a person-tag to a post on 2017-12-13:

Jamie Tanna

  Jamie Tanna adds a person tag for a FQDN and is platform aware (as per so will syndicate the Twitter username when POSSE'ing to Twitter if it is known by Jamie' site.

Example of note and syndicated Tweet


capjamesg has implemented person tag support on his personal website. Person tags can be used in any post type on his site. To use a person tag, James follows this syntax:

Where is equal to the unique identifier for a person. This may be a domain name or another identifier, such as a nickname the person uses in a chat group.

James has a repository of person tags on his site to which he can refer. If a person tag does not exist, a regular link with the anchor text equal to any domain name specified in the tag syntax is created. If a person tag does exist, the tag uses the name and domain name in his tag registry.

For example, might translate into:

<a href=''>James' Coffee Blog</a>

James wrote about adding person tag support to his site in IndieWeb New Years' Eve Commitment: Expanding my person tags.

Past Examples

Kyle Mahan

Kyle Mahan added support for person tags to Red Wind on 2015-11-17, where any person in the contact list can be tagged:

Tool Support


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 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

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.


  • 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 link where facebookUserID is the numerical id of the person being person-tagged (available in the source of their profile in an invisible fb://

Feature requests:

  • Twitter person-tag support
    • #459 - support person-tags (including to Twitter). Closed because no sign of API support now or soon.
    • #547 - support "fake" person-tags as in-tweet text. Unlikely as a lot of custom work, and should be prototyped with Indie Web (perhaps manual) POSSEing first.


Person tagging support is done by collecting h-cards from the currently displayed channel as well as the user's Micropub endpoint for contacts.

IndieWeb Interest

Kyle Mahan

Kyle 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[2]. I don't want people to be left out.
Since this comment, and for some time now, my thoughts are more aligned with what ĎÚβĨŐÚŚ Dod and Amy Guy wrote below, especially since the emergence of ClearView as a tool that scrapes tagged photos and provides a service to authorities, without any consent from those whose photos are being scraped.

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.


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 - 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

... 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.


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.


By tagging someone in a post, you are disclosing information about them that they may not wish to have disclosed and/or involving them in a conversation unwillingly.

This can range from sharing and tagging their photo when they might not want such things to be seen publicly to simply feelings of awkwardness.


Deciding whether to person tag others

  • Check the site of the person being tagged to see if they have posted something equivalent. Example, if they posted they were at X event and they also have photos of themselves in general, this could be an indicator.
  • For events like Homebrew Website Club and Indiewebcamp that have an explicit photo policy with a distinctive opt-out, this could be considered consent.
  • Take extra care in tagging people for older content. While someone may have been fine with a photo or attending an event at the time, being reminded years later...their perspective may have changed.
  • If you are truly concerned, ask.

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:

  1. A tags B in a photo
  2. B is notified that they’ve been tagged
  3. B can tap that notification or view their notifications and tap the entry to view it
  4. B when viewing the photo, B can see that they’ve been tagged in it and has the option to untag themselves,
  5. B can optionally also block A so they cannot person-tag B in the future

Another variant involves three people (e.g. Flickr and Facebook allow this):

  1. A posts a photo
  2. C sees that post in their reader
  3. C recognizes B and tags B in the photo
  4. B receives a notification and can view the photo, untag themselves etc. just like before
  5. 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

rather than

  • 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 ...

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)


  • '#' - 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. "" 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"
  • Thus: as plain text shorthand to mean explicitly (person)-tag with ""

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:

  •, Facebook/tantek.celik)
  •, Facebook/Starbucks)

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

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

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:


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:

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

    Selfie with

    In this case this should be stored as is in the content source, and the person-tag markup for 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

  2. 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_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 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)
    • 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.

👤 <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

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.

👤 Person1givenname (, Person2givenname (, and Person3givenname (

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:


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 @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 @exampleorg

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 … (

Where "" 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:

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 👤

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

e.g. authoring:

Selfie with #@exampleperson

tweet text:

Selfie with 👤 @exampleperson

with many more:


Selfie with #@exampleperson #@exampleorg

tweet text:

Selfie with 👤 @exampleperson @exampleorg

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

To suggest person-tags in someone else’s photo, post a person tag reply

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:

<img src="some_photo.jpg" alt="Tantek, Aaron and Amber!" usemap="#peeps" class="u-photo">

<map name="peeps">

<area shape="circle" coords="124,58,8" class="microcard h-card u-url" href="" alt="Tantek Çelik">

<area shape="rect" coords="0,0,82,126" class="microcard h-card u-url" href="" alt="Aaron Parecki">

<area shape="circle" coords="90,58,3" class="microcard h-card u-url" href="" 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


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]


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:

See Also