SocialLink is a social networking client designed to let you follow people across a bunch of social networks. Rather than following a bunch of accounts individually across a bunch of different sites, you can instead just follow a person and see everything they post on their accounts in chronological order, regardless of where it was posted.

Not pictured: The home page, which shows all of your contacts in alphabetical order, with 'unread posts' at the top. It's fairly difficult to screenshot without including tons of personal details, so I'd rather not show that off.

alt text alt text alt text alt text alt text alt text alt text alt text

Break it Down

The modern web is terrible. SocialLink is different, for a few reasons:

Supported Social Networks:

Hindsight Integration:

SocialLink can also be used in conjunction with Hindsight, another project I wrote. Hindsight is designed to show you what happened on a given date, and focuses mostly on private datasets, like photos you took and chat logs. If the two projects are installed and linked together, SocialLink will show chat logs from within Hindsight's database, and Hindsight will show social networking posts that occurred on that date using SocialLink's database.

Chat log support (via Hindsight) includes:

In order to avoid polluting contact cards with old contact information, Hindsight lets you tag the name of each person next to the corresponding database row. This way, old text messages can get rendered on a given profile page without polluting the contact card with old phone numbers.

Wake Up, Get Up, Get Out There

To use SocialLink, you must have:

You will also need various scrapers, which fetch the actual content and fill SocialLink's database. SocialLink is merely a viewer of content inserted into those databases, it doesn't perform any actual scraping itself. Most of the scrapers for SocialLink are currently closed source.

Disk space depends on the number of accounts you're following, and the number of posts they each have. Expect it to consume several hundred GB, not including YouTube videos - those are only scraped if manually enabled[1].

Beneath the Mask

Why did you write this?

SocialLink started as a solution to a few problems I had, and this seemed like a decent way to solve them. For more details on this (and the weird architecture shared with Hindsight), take a look here.

How does it group accounts into people?

SocialLink uses the contact cards in your address book to determine what accounts belong to which person. For example, Tom's contact card contains his Instagram account, Twitter username, and YouTube channel, which tells the front-end to integrate all three types of posts into one when his profile is loaded.

Does this violate people's privacy?

SocialLink can't access anything you weren't originally allowed to be able to see, and it doesn't have any mechanisms for sharing things with other people. You should, however, use discretion when running it, in the same way you probably don't let your friends use your social media accounts to spy on people they don't have as friends (but you do).

Reasons like this, and the fact that it has access to your entire address book, are some of the many reasons this is locally hosted software, requires you to log in, and only supports one user.

Does this violate the terms of service for [some website]?

SocialLink is not a scraper - it merely renders content that you have stored in its database. If you choose to violate a site's terms of service to fill its database, that's on you.

That being said, YouTube and Reddit have actual APIs with actual terms of service.

Can I view group conversations?

Yes. Create a contact card with a name that starts with # - this will force SocialLink to use its group renderer when loading any pages under that contact. The group renderer differs from the normal renderer in two basic ways:

Can I delete individual database rows?

It isn't recommended. If the database row came from a social network, the scraper will end up rescraping it next time it runs. Likewise, if you import a chat log, delete a row, then re-import a superset of that log, the row will be re-created if it exists in the log. You're better off just marking the row as 'enabled: false', which will prevent it from ever showing.

Where'd the name come from?

Social Links are a gameplay mechanic from the Persona series, which I was playing at the time of development. It seemed fitting, given that this is a tool to manage your connections with people. It's also why all of the section titles are Persona 5 song titles.

Why do I need to give this my real name?

You have to supply your real name in the config file in order for it to figure out which person in a conversation is you. Selecting "the person who's name isn't at the top of the page" doesn't work for group chats.

Any known bugs?

Last Surprise

SocialLink is currently the only tool capable of rendering and displaying Facebook profiles from graph database entries. It includes code to replicate Facebook's TAO on top of ActiveRecord. Should you manage to obtain such a database, SocialLink can render it.

Facebook's own data export tool, Download Your Information, has a bunch of things missing from its dumps, which is why a separate approach was taken with this viewer.

Notable errors and omissions of DYI:


SocialLink is licensed under the GNU Affero General Public License. Source code is available on GitHub. Under no circumstances should you have someone else host it for you.


[1] Unlike other services, YouTube videos are rendered with iframes to the YouTube player. Scraping a large Instagram account might use upwards of 1 GB, but scraping a YouTube account like LinusTechTips in best quality might use multiple terabytes.

Self-hosting scraped videos from YouTube is problematic for a number of reasons, so for now an iframe is the lesser of two evils.

Pros/cons of iframes vs self-hosting:

Accounts can be marked within SocialLink to download all videos automatically for any associated YouTube accounts (using youtube-dl / yt-dlp), and SocialLink will show an indicator next to any YouTube videos that are already stored on disk. However, these files are never used to render any content.

[2] SocialLink has support for rendering webcomics, effectively treating them as a social network with 'posts' (comic issues). Since there's no real standard on comic websites, SocialLink just renders what's in a specific database table, according to its schema. It is your responsibility to put data into that table, scraping and transforming it on the way in. This is slightly annoying to do, but has the added benefit of supporting any comic, including comics that might not be online anymore. As long as you can fill the database, SocialLink will render it.

[3] You can technically import all of your old SMS messages from every mobile platform, but you're better off migrating everything to your current phone and then importing that. This has the main advantage of letting you view all of your old texts on your current device.