ident engine

About Ident Engine

How it works

Many social media sites link our profiles to different sites by adding the rel=me attributes to hyperlinks. The elsewhere module follows these rel=me links and creates a graph of pages about an individual.

The elsewhere modules can also be used to extract profile information such as a person's name, who they work for and other information.

The power of rel=me

rel=me is part of XFN, a simple but powerful little microformat for marking up relationships. We can use XFN to define an interlinking set of web pages that together, represent an individual. To achieve this, simply add the rel=me attribute to any link between two web pages that represent the same person. For example:

The links between twitter and my blog

<a rel="me" href="http://glennjones.net/">http://glennjones.net/</a>
<a rel="me" href="http://twitter.com/glennjones/">Twitter</a>    

The elsewhere module – A rel=me spider

Elsewhere module is a rel=me spider that aims to replicate part of the functionality of Google’s, now discontinued, Social Graph API. When given the URL of a person’s website or social media profile (e.g. a Twitter account), it outputs a JSON-formatted list of the other websites and social media profiles that belong to that person. In other words, it can determine a person’s ‘social graph’ from a single URL in the graph.

The elsewhere-mapper module – A social graph node mapper

The job of the elsewhere-mapper module is to clean-up the list of links found for one individual. It adds metadata which provides access to additional URLs for open data sources such as RSS feeds. It does this by passing a URL through urlTemplates which are pre-described URL structures for a given site and creates a SGN to describe a user account on that site.

The urlTemplates and mapping data structure:

{
    "name": "Stumbleupon",
    "domain": "stumbleupon.com",
    "urlMappings": [{
        "urlTemplate": "http://stumbleupon.com/stumbler/{username}",
        "schema": "None",
        "contentType": "Profile",
        "mediaType": "Html"
    }, {
        "urlTemplate": "http://stumbleupon.com/rss/stumbler/{username}/likes",
        "schema": "Rss",
        "contentType": "Bookmarks",
        "mediaType": "Rss"
    }, {
        "urlTemplate": "http://stumbleupon.com/rss/stumbler/{username}/comments",
        "schema": "Rss",
        "contentType": "Activity",
        "mediaType": "Rss"
    }],
    "www": true
}

A resulting SGN for the Stumbleupon mapping would look this:

sgn://stumbleupon.com/?ident=glennjones 

After the mapping process you have a much fuller list of URLs and you also know what content a page has and what format it's stored in. The return mapping results look like this:

{
    "name": "Stumbleupon",
    "domain": "stumbleupon.com",
    "sgn": "sgn://stumbleupon.com/?ident=glennjones"
    "username": "glennjones"
    "urlMappings": [{
        "urlTemplate": "http://stumbleupon.com/stumbler/glennjones",
        "schema": "None",
        "contentType": "Profile",
        "mediaType": "Html"
    }, {
        "urlTemplate": "http://stumbleupon.com/rss/stumbler/glennjones/likes",
        "schema": "Rss",
        "contentType": "Bookmarks",
        "mediaType": "Rss"
    }, {
        "urlTemplate": "http://stumbleupon.com/rss/stumbler/glennjones/comments",
        "schema": "Rss",
        "contentType": "Activity",
        "mediaType": "Rss"
    }],
}

The elsewhere-profiles module – A profile aggregator

The elsewhere-profiles module takes the JSON output from elsewhere-mapper and finds all the profile pages which contain a hCard. It parses these pages building both a list of profile data and a single combined profile. The profile data is returned in the ufJSON format used to describe microformats. The module also has a plug-in architecture for getting data from APIs which do not need any type of access keys.