27 votes

LinkLonk - A link aggregator with a trust system

I built a link sharing website where you connect to users that share your interests. When you upvote a link - you connect to other users who upvoted that link and LinkLonk shows you what else these users upvoted.

The more in common you have with another user the more prominently their other recommendations appear on your list.

The intuition is that the more useful your past recommendations have been for me, the more I can trust your future recommendations.

This is how trust works in meatspace - we keep track of how positive our experiences have been with other people and use that track record to decide who we can trust in the future.

Except that mechanism does not work online. It just does not scale to the numbers of users we interact with. We can remember around 150 other people (the Dunbar number). Beyond that our builtin trust mechanism breaks down. We revert to more coarse and primitive trust mechanisms such as tribalism and mistrust in everyone.

While we cannot personally keep track of every user on a platform - that is what computers are good at.

That is the idea behind LinkLonk. You don't need to remember the names of users who you can trust (in fact there are no usernames on LinkLonk). You simply upvote content that was useful to you and LinkLonk constantly keeps track of how useful every other user has been and ranks new content accordingly.

Another important part of trust is that if you misplace your trust in someone and they let you down then you need a mechanism to stop trusting them.

This is what the downvote button is used for: when you downvote an item, LinkLonk reduces your “trust” in other users that upvoted it. As a result, you will see less content from those users.

The above describes the basic idea. There are a couple more concepts:

  • You start off weakly connected to all users, which means that at first you see content sorted by popularity. Rate something and refresh the page - the ranking will change.
  • You are not limited to a single persona/interest. If you have multiple interests then you can create a separate collection for each of your interests. When you upvote a link you can choose what collection it belongs to. For example, if you are interested in woodworking and music then you can create two collections and put woodworking links into one and music links into the other. Then other people who liked your woodworking recommendations will only see your other recommendations from the same collection and will not get your music. This is mostly a way for you to help other users find relevant content. It’s optional. You can put everything into the “default” collection if you don’t feel like organizing.
  • LinkLonk has another source of recommendations - RSS feeds. When you upvote a blog post LinkLonk connects to the RSS feed of that blog - as if it was another user. LinkLonk pulls updates from the feed and shows you the new entries using the same ranking algorithm: the more you upvote items from the feed the higher the other items from the feed are ranked. You can submit any RSS url and LinkLonk will connect (subscribe) you to it. My hope is that in the early days when we don't have many users you would find LinkLonk useful as a sort of an RSS reader.
  • Moderation. When you downvote an item then you get connected to other users who also downvoted that same item. In other words, you will trust their other downvotes. If they downvote something then that item will rank lower for you.

Give it a try at: https://linklonk.com/register with 'tildes' as the invitation code. The invitation code can be used multiple times and I will keep it active for a few days. After that please DM me to get a fresh code.

I’m posting this on Tildes in part because I like the group of people that Tildes has attracted. And I also feel the topics of trust systems, content curation and moderation are relevant to Tildes and to its users (see: https://docs.tildes.net/future-plans#trustreputation-system-for-moderation).

What do you think?

26 comments

  1. [5]
    Comment deleted by author
    Link
    1. lonk
      Link Parent
      Switched the icons to svg (tutorial). Please give it a try!

      Switched the icons to svg (tutorial). Please give it a try!

      6 votes
    2. lonk
      Link Parent
      Thanks for the feedback! I will look into it.

      Thanks for the feedback! I will look into it.

      5 votes
    3. [2]
      PendingKetchup
      Link Parent
      How do you get inine SVG to... not be inline? With something like Font Awesome you can say "download icon here" and get a download icon. With inline SVG you need to manually copy-paste the SVG...

      How do you get inine SVG to... not be inline? With something like Font Awesome you can say "download icon here" and get a download icon. With inline SVG you need to manually copy-paste the SVG everywhere you want it, right? Or can you get it to be inline in the style sheet somehow?

      2 votes
      1. [2]
        Comment deleted by author
        Link Parent
        1. PendingKetchup
          Link Parent
          Are we always supposed to be using front-end frameworks and build systems now? I've always felt like they're overkill of you're making a page instead of writing an application.

          Are we always supposed to be using front-end frameworks and build systems now? I've always felt like they're overkill of you're making a page instead of writing an application.

          1 vote
  2. [7]
    cfabbro
    (edited )
    Link
    This is a neat idea, at least on paper, but your documentation is currently incredibly sparse which leaves a lot of questions about the site unanswered, IMO. E.g. Is this opensource? I assume not...

    This is a neat idea, at least on paper, but your documentation is currently incredibly sparse which leaves a lot of questions about the site unanswered, IMO. E.g.

    Is this opensource? I assume not since there is no links to github/gitlab.
    How long do you retain voting data for, and does deleting an account delete all associated data along with it?
    What sort of content restrictions and code of conduct (if any) does the site have or intend to have?

    p.s. I can't even register for an account, since every time go to linklonk.com/register, it immediately redirects me to linklonk.com/login for some unknown reason. This is happening on both Chrome and Firefox.

    9 votes
    1. [6]
      lonk
      Link Parent
      Thanks for giving it a try and sorry for the frustrating experience! I think I made a last minute change that created this redirect loop from /register to /login. I disabled the redirect to...

      Thanks for giving it a try and sorry for the frustrating experience! I think I made a last minute change that created this redirect loop from /register to /login. I disabled the redirect to /login. Could you please reload the website to see if you can register now?

      It may require clearing cache. On Firefox please hold Shift when you press the reload button (https://support.mozilla.org/en-US/questions/1073264).

      To answer your questions:

      1. It is not open-source. I don't have plans to open-source it at the moment.
      2. Your votes do not get deleted as time passes. Is this a concern? Would you like an option of your votes being deleted after some time?
      3. When you delete your account all your data is deleted including your votes. I'll update the /privacy page to reflect that.
      4. Yes, I will need to work on this. linklonk.com/terms currently says: "Please do not submit content that does not advance that goal. This includes content that is meant to misinform, shock, harass or harm people." I would like to keep the website "safe for work". I absolutely do not intend it to become a cesspool. That's why it is limited to invite only. In the future I will add functionality for existing users to invite new users like Tildes does it.
      7 votes
      1. [5]
        cfabbro
        (edited )
        Link Parent
        I'm not being redirected anymore, but when I click "Register with a temporary account" after inputting the "tildes" invitation code, I get a popup with [object Object] and an "OK" prompt, and...

        I'm not being redirected anymore, but when I click "Register with a temporary account" after inputting the "tildes" invitation code, I get a popup with [object Object] and an "OK" prompt, and after clicking that the popup disappears but nothing else happens. Looking in the Firefox Inspector network log, it seems I am getting a 401 Unauthorized error with a "wrong auth header" response.

        As to your answers:
        It's a bit disappointing to hear that you don't have any plans for it to be opensource, especially since that means the trust system will be rather opaque. It's not necessarily a deal breaker, but it does make me a bit more wary, is all.

        My personal data being stored indefinitely is always a bit concerning to me, which is why I like Tildes Privacy By Design philosophy, and 30 day retention policy for sensitive data (including vote data), but I am glad to hear that deleting the account also deletes all associated data as well.

        And that's also good to know that you seem to have good intentions, and don't want to allow the site to become a cesspool. :)

        11 votes
        1. [4]
          lonk
          Link Parent
          Thank you for the detailed report of the problem. I have reproduced it locally. Will try to fix it asap. Sorry!

          Thank you for the detailed report of the problem. I have reproduced it locally. Will try to fix it asap. Sorry!

          3 votes
          1. [3]
            cfabbro
            Link Parent
            No worries. I look forward to checking out the site once you get the issue resolved. :) p.s. This is also one advantage to opensourcing BTW... if you create a github or gitlab page for the site,...

            No worries. I look forward to checking out the site once you get the issue resolved. :)

            p.s. This is also one advantage to opensourcing BTW... if you create a github or gitlab page for the site, people experiencing problems can more easily submit bug reports. E.g. https://gitlab.com/tildes/tildes/-/issues ;)

            4 votes
            1. [2]
              lonk
              Link Parent
              The issue is fixed now. Please clear the cache and reload the page. You can tell if the cache was cleared if the title of the registration screen says: "Register a new account (fixed)". I'm amazed...

              The issue is fixed now. Please clear the cache and reload the page. You can tell if the cache was cleared if the title of the registration screen says: "Register a new account (fixed)".

              I'm amazed 2-3 people managed to register at all!

              The registration flow was supposed to create a new anonymous Firebase account as the first step, but I had that step deleted. So the registration would fail.

              Only users who went to linklonk.com/login first and signed in with an email account would have been able to then go to linklonk.com/register and complete the registration process.

              Way to announce your hobby project!

              3 votes
              1. cfabbro
                (edited )
                Link Parent
                Yep, it works now, as does everything else on the site from what I can tell after a quick explore. Sweet. :) Since the trust algorithm is opaque, and I imagine it will take some time (and a fair...

                Yep, it works now, as does everything else on the site from what I can tell after a quick explore. Sweet. :)

                Since the trust algorithm is opaque, and I imagine it will take some time (and a fair amount of votes) for me to sufficiently judge how well it works, so there isn't really much I can say about that aspect of the site yet. But the site itself looks decent enough.

                My only suggestion so far would be to consider adding a Title field for link submissions, which users can fill out, since bare titles scraped from the sites themselves are often pretty hard to judge the content by. And you could also maybe take a look at a metadata scraper, like Embedly Extract (which Tildes also uses) or one of the various free alternatives out there, to help add some more information/context to submissions as well.

                p.s. Don't worry about the technical hiccup too much. I think most people here on Tildes (which is technically still in Alpha itself), are pretty forgiving of such things. :)

                6 votes
  3. lonk
    Link
    Thanks, everyone, who gave LinkLonk a try! Some stats: 25 people registered, of which 10 made their accounts permanent out of 10 permanent accounts, 8 upvoted at least one item (42 upvotes) out of...

    Thanks, everyone, who gave LinkLonk a try!

    Some stats:

    • 25 people registered, of which 10 made their accounts permanent
    • out of 10 permanent accounts, 8 upvoted at least one item (42 upvotes)
    • out of 15 temporary accounts, 3 upvoted something (10 upvotes)
    • 1 downvote
    • 1 feedback report submitted through the anonymous feedback form

    Please let me know (using the above form or DM) what would improve your experience most. I would greatly appreciate that!

    7 votes
  4. [2]
    KapteinB
    Link
    Sounds like a cool concept! Have you done the math on how much computing power it will need if it gets popular?

    Sounds like a cool concept!

    Have you done the math on how much computing power it will need if it gets popular?

    6 votes
    1. lonk
      Link Parent
      There is definitely more computing power necessary compared to popularity based systems (Reddit) or explicit follow systems (Twitter). And it grows with the square of users if implemented naively....

      There is definitely more computing power necessary compared to popularity based systems (Reddit) or explicit follow systems (Twitter). And it grows with the square of users if implemented naively.

      But there are ways to make the calculations approximate and much more efficient. For example, at serving time we could limit the number of source users to top 10K by your connection weight to them.

      I look at this from the other perspective - if the computer does not do this tracking of how useful other users are to you then you have to do this. And from that perspective I think all that computation is justified.

      3 votes
  5. [2]
    Comment deleted by author
    Link
    1. lonk
      Link Parent
      The primary use case is to find useful content. This is what I implemented first. Similar to how Reddit started with just links to content. Self posts and comments were added later. With LinkLonk...

      The primary use case is to find useful content. This is what I implemented first. Similar to how Reddit started with just links to content. Self posts and comments were added later.

      With LinkLonk I want to see if it solves the primary use case well enough to be useful to enough people. If it does, then we can add text posts and comments and usernames.

      Regarding comments, I think it would be super useful to apply the same ranking mechanism to comments.

      5 votes
  6. [5]
    vord
    (edited )
    Link
    I'm excited to try! I feel like Stumbleupon was the last tool I used that did something similar, although I think it just clustered content type and followed users. Things Stumbleupon did well...

    I'm excited to try! I feel like Stumbleupon was the last tool I used that did something similar, although I think it just clustered content type and followed users.

    Things Stumbleupon did well that I miss:

    • Just sending you to a random site, rather than aggregating it. Gave you a barrier to entry to look at it rather than just scroll past
    • Ability to send links by somebody else with a few clicks, and it would appear next time they Stumbled. It was nice and asynchronous, rather than this new world of constant nags to be synchronous.

    Edit: Registration might be broken again

    3 votes
    1. [4]
      lonk
      Link Parent
      Could you please help me debug the registration problem you are facing? I tried to register a new account and couldn't reproduce the problem (in Chrome on desktop). How is it broken for you? Any...

      Could you please help me debug the registration problem you are facing? I tried to register a new account and couldn't reproduce the problem (in Chrome on desktop).

      How is it broken for you? Any chance you could share error messages from the JavaScript console? To open the console: Ctrl+Shift+J in Chrome or Ctrl+Shift+K in Firefox.

      Does the registration page have this title "Register a new account (fixed)"? If it does not have "(fixed)" in the end then you are seeing the old version from the browser's cache. Please try to clear the cache and reload the page.

      I used StumbleUpon back in the day and my impression of it was that my thumb up/down ratings did not play a role in what content I would see. Rather it would use the aggregate ratings to determine if a link was generally good or not. I didn’t feel motivated to rate links.

      With LinkLonk I would like to create a feedback loop where you would clearly see a benefit for yourself in rating content. That’s why when you upvote something you see a message like: “you will see more content from 3 other people who also liked this”. Or when you get a recommendation, you see an explanation of why it was recommended to you - because it was liked by 4 people who liked X and Y, which you also liked.

      I also had a sense that StumbleUpon was specifically for serendipitous discovery. It means going broad but not necessarily deep. With LinkLonk I hope to support both use cases depending on what content you upvote.

      Regarding asynchronicity, I tried to make the recommendations wait for you so you don’t feel the pressure to check updates before they are gone. The top recommendations stay on top for a week (by default) until you explicitly mark them as read.

      3 votes
      1. [3]
        vord
        Link Parent
        It did have "fixed", but it also started working since posting this. I'm using Firefox on Android. When I hit submit there was also a pop-up dialog saying "[Object] Object", but it did work. Like...

        It did have "fixed", but it also started working since posting this.

        I'm using Firefox on Android. When I hit submit there was also a pop-up dialog saying "[Object] Object", but it did work.

        Like it so far. I like the popular section, but would also suggest a random and/or new section not tied directly to your trust for a "break out of bubble" content discovery.

        1 vote
        1. [2]
          lonk
          Link Parent
          I think I have fixed most of the problems with the registration flow (the updated title should say "Register a new account (fixed, take 2)"): I fixed the bad error message "[Object] Object"....

          I think I have fixed most of the problems with the registration flow (the updated title should say "Register a new account (fixed, take 2)"):

          • I fixed the bad error message "[Object] Object". Initially, I called "alert(error)", but the correct way to show the error message is "alert(error.error)".
          • The code didn't handle the case if you pressed "Register with a temporary account" multiple times (e.g., press enter in the invitation code input field and then press the registration button). Now the button becomes disabled while the first request is being handled.
          • I saw in the server logs that there were repeated registration requests (within the same second). The server used to return an error (412 PreconditionFailed) when the user was already registered. I changed it to not be considered an error.
          • The web UI code was trying to load the list of the user's collections from the API as soon as the user is signed in. But I think it was firing before the registration request was complete and the collections request would fail with "401 Unauthorized", which would cause you to be redirected back to the registration page. I moved the code to fetch the list of collections after the registration is done.
          • The server used to check for the exact code match. But on a phone with auto-capitalization of the first letter you would enter "Tildes" which to be an invalid code. Now the matching is case-insensitive.

          Thanks for bearing with me!

          I like the "break out of bubble" idea. How about a version of the popular page where you see links from users that you are not connected to already?

          2 votes
          1. vord
            Link Parent
            I like that idea. Would probably need to be coupled against a low-pass filter of some sort (or must be from a comparably large trust bubbles with little anti-trust). And since it's anonymous,...

            How about a version of the popular page where you see links from users that you are not connected to already?

            I like that idea. Would probably need to be coupled against a low-pass filter of some sort (or must be from a comparably large trust bubbles with little anti-trust).

            And since it's anonymous, perhaps a "random user's" page as well, where it just shows some other users page at random.

            3 votes
  7. [3]
    Comment deleted by author
    Link
    1. [2]
      lonk
      Link Parent
      Thanks for such a detailed comment! I think we need to get a critical mass of users in order to tell how effective the algorithm is. Right now there are simply too few users and ratings for you to...

      Thanks for such a detailed comment!

      I think we need to get a critical mass of users in order to tell how effective the algorithm is. Right now there are simply too few users and ratings for you to strongly connect to a specific topic. I would love to see people start using collections and curating lists of links for their specific interests. It's a chicken and egg problem - for people to start curating collections of links there need to be enough users to benefit from this work.

      Why I believe it could be effective:

      • Prior to the launch, I've been using it in the "single player" mode where the content would come only from RSS feeds. The feeds that have a higher signal-to-noise ratio were prioritized and it worked well from my (biased) perspective.
      • I tested the algorithm on the Movielens.org dataset. I replayed the movie rating history (4+ stars) and before each rating I would calculate recommendations based on the algorithm and based on pure popularity. Then I would compare the rank of the ground truth item between the two algorithms. The LinkLonk's rank of the next item was higher than the popularity based rank. Of course, popularity based ranking is a weak baseline, but it is very commonly used: Tildes/HackerNews/Reddit.
      • Pinterest successfully uses Personalized PageRank at scale: https://blog.acolyer.org/2018/05/23/pixie-a-system-for-recommending-3-billion-items-to-200-million-users-in-real-time/
      3 votes
      1. [2]
        Comment deleted by author
        Link Parent
        1. lonk
          Link Parent
          Thanks for mentioning the font size! I updated the main font size from 14px to 16px and the secondary from 13px to 14px. Now it is in accordance with the Material spec:...

          Thanks for mentioning the font size! I updated the main font size from 14px to 16px and the secondary from 13px to 14px. Now it is in accordance with the Material spec: https://material.io/design/typography/the-type-system.html#type-scale

          2 votes
  8. [4]
    Amroth
    Link
    Won't this essentially lead to a huge filter bubble? I feel like this a huge problem on reddit already, with many power users filtering the subreddits/posters/tags they want to see and the...

    Won't this essentially lead to a huge filter bubble? I feel like this a huge problem on reddit already, with many power users filtering the subreddits/posters/tags they want to see and the "gatekeepers" on r/new downvoting whatever they deem uninteresting. Maybe a mechanism that introduces "novel" topics or things that are particularly interesting but outside your normal interests would help?

    1. [3]
      lonk
      Link Parent
      Happy New Year! Your comment has a lot packed into it. Let me try to address these questions/concerns separately. Is LinkLonk a filter bubble? From the FAQ part of https://linklonk.com/about: When...

      Happy New Year!

      Your comment has a lot packed into it. Let me try to address these questions/concerns separately.

      Is LinkLonk a filter bubble?

      From the FAQ part of https://linklonk.com/about:

      On LinkLonk you pay attention to those who you chose to pay attention to. In a sense, LinkLonk is a filter bubble.

      A filter bubble is a problem when a system chooses content to show to you without giving you clear control or an explanation of how it came up with these recommendations.

      On LinkLonk the ranking mechanism is transparent and is easy to understand. LinkLonk does not try to guess what you would like. What you see is controlled by your explicit ratings. For example, when you see a recommendation from users, LinkLonk explains what links you have in common with these users.

      When I wrote that I had in mind a system that is powered by a machine learning model trained to optimize for "engagement".

      I think it applies to your Reddit example as well. Only it is not some black box automated system that determines what you see. It is the members of the group that determine what you see.

      Group dynamics are a challenge

      See:

      The problem is that the group is a shared resource. You either take it or leave it as a whole. You cannot take just the good parts and leave the bad parts. You either try to control who is in the group and who is out to keep the signal to noise ratio high enough for you, or you just leave.

      LinkLonk sidesteps these problems by not having the concept of a group. The experience of every user is unique and is primarily determined by the user themself. Instead of a shared group, each user has their own group of users that they decided to pay attention to. Without a shared group, a lot of these problems go away.

      Outsized effect of early votes

      Both Reddit (details) and HackerNews (details) use exponential time decay when converting the number of votes to the ranking score. This results in votes that are cast right after the item is submitted to have much more weight than votes cast an hour after the submission. This makes people who spend time voting on new submissions have a huge effect on what makes it to the frontpage and what doesn't.

      On LinkLonk it does not matter how long ago the item was first submitted. What matters is who upvoted/downvoted the item and how much you trust them.

      No user can assume the role of a gatekeeper simply by voting on items early on. They need to earn your trust first.

      Finally, I do agree that there is a place for discovery outside of your filter bubble. Please see the vord's comment above (or below) for some ideas.

      3 votes
      1. [2]
        Amroth
        Link Parent
        Very interesting! Thank you for your elaborate answer, I found your links to be quite fascinating. I noticed that some links lose their relevance after a while, for instance there was a giveaway...

        Very interesting! Thank you for your elaborate answer, I found your links to be quite fascinating. I noticed that some links lose their relevance after a while, for instance there was a giveaway for a game that was linked on LinkLonk that is no longer available. Downvoting this link will unjustly make content from the posters less interesting, even though it was very relevant at one point. Do you have a solution in mind for this? Or do you simply consider the "30days" window to be the default?

        2 votes
        1. lonk
          Link Parent
          I think you are referring to this: https://www.theverge.com/good-deals/2020/12/30/22206586/metro-last-light-redux-free-on-gog-steam-sale I don't have a solution for this. Ideally, the expiration...

          I think you are referring to this: https://www.theverge.com/good-deals/2020/12/30/22206586/metro-last-light-redux-free-on-gog-steam-sale

          I don't have a solution for this. Ideally, the expiration time would be part of the <meta> tags in the source page so we could automatically determine if a link has "expired". Without a source of truth, we could only rely on the users to provide that information. That would require a mechanism to come to a consensus and to resist abuse. This is where a trust-based system could, again, be helpful. For example, you would vote on user-provided metadata (upvote if it was helpful and correct, downvote if it was misleading) and that would affect who you trust to get metadata from.

          Such system could be useful for user-submitted titles. For example, for some pages we cannot extract the title, or the original title is bad. The users could suggest their own title and vote on the existing suggestions.

          To be clear, these are only ideas for the future, not something I would add in the near future. I would like to see sustainable usage of the existing system before introducing more complexity.

          For now, it's up to you to decide if you want more content recommendations from people who upvoted that - now expired - link or less and vote accordingly.

          1 vote