So, it seems like PieFed is becoming a real alternative to lemmy.

What are the differences between these two? From a tech perspective, and also morality/ethics, if you want. Any differences in vision for these services?

Say whatever is on your mind. I want to know.

On which one should we put our weight?

PieFed all the way. It’s developing at lightning speed, while Lemmy lags behind as the transphobic genocide denying devs beg for donations with in built donation begging banners on all Lemmy instances front pages. Instances are apparently scared to defed from .ml for fear the devs wont support them with help.

Rimu has made some interesting choices, such as blocking 196 from default federating posts until a user subs first or a dislike for meme subs. But when spoken to has been receptive and removed such things or made them optional for admins.

Ethically and feature wise PieFed is in the lead, its not perfect but its open to change and receptive to ideas

  • RedWizard [he/him, comrade/them]@hexbear.net
    link
    fedilink
    English
    arrow-up
    53
    ·
    edit-2
    18 days ago

    @[email protected] was looking at PieFed code the other week, and I ended up taking a look at it too. Its great fun to sneak a peak at.

    For example, you can not cast a vote on PieFed if you’ve made 0 replies, 0 posts, AND your username is 8 characters long:

        def cannot_vote(self):
            if self.is_local():
                return False
            return self.post_count == 0 and self.post_reply_count == 0 and len(
                self.user_name) == 8  # most vote manipulation bots have 8 character user names and never post any content
    

    If a reply is created, from anywhere, that only contains the word “this”, the comment is dropped (CW: ableism in the function name):

    def reply_is_stupid(body) -> bool:
        lower_body = body.lower().strip()
        if lower_body == 'this' or lower_body == 'this.' or lower_body == 'this!':
            return True
        return False
    

    Every user (remote or local) has an “attitude” which is calculated as follows: (upvotes cast - downvotes cast) / (upvotes + downvotes). If your “attitude” is < 0.0 you can’t downvote.

    Every account has a Social Credit Score, aka your Reputation. If your account has less than 100 reputation and is newly created, you are not considered “trustworthy” and there are limitations placed on what your account can do. Your reputation is calculated as upvotes earned - downvotes earned aka Reddit Karma. If your reputation is at -10 you also cannot downvote, and you can’t create new DMs. It also flags your account automatically if your reputation is to low:

    PieFed boasts that it has “4chan image detection”. Let’s see how that works in practice:

                if site.enable_chan_image_filter:
                    # Do not allow fascist meme content
                    try:
                        if '.avif' in uploaded_file.filename:
                            import pillow_avif  # NOQA
                        image_text = pytesseract.image_to_string(Image.open(BytesIO(uploaded_file.read())).convert('L'))
                    except FileNotFoundError:
                        image_text = ''
                    except UnidentifiedImageError:
                        image_text = ''
    
                    if 'Anonymous' in image_text and (
                            'No.' in image_text or ' N0' in image_text):  # chan posts usually contain the text 'Anonymous' and ' No.12345'
                        self.image_file.errors.append(
                            "This image is an invalid file type.")  # deliberately misleading error message
                        current_user.reputation -= 1
                        db.session.commit()
                        return False
    

    Yup. If your image contains the word Anonymous, and contains the text No. or N0 it will reject the image with a fake error message. Not only does it give you a fake error, but it also will dock your Social Credit Score. Take note of the current_user.reputation -= 1

    PieFed also boasts that it has AI generated text detection. Let’s see how that also works in practice:

    # LLM Detection
            if reply.body and '—' in reply.body and user.created_very_recently():
                # usage of em-dash is highly suspect.
                from app.utils import notify_admin
                # notify admin
    

    This is the default detection, apparently you can use an API endpoint for that detection as well apparently, but it’s not documented anywhere but within the code.

    Do you want to leave a comment that is just a funny gif? No you don’t. Not on PieFed, that will get your comment dropped and lower your Social Credit Score!

            if reply_is_just_link_to_gif_reaction(reply.body) and site.enable_gif_reply_rep_decrease:
                user.reputation -= 1
                raise PostReplyValidationError(_('Gif comment ignored'))
    

    How does it know its just a gif though?

    def reply_is_just_link_to_gif_reaction(body) -> bool:
        tmp_body = body.strip()
        if tmp_body.startswith('https://media.tenor.com/') or \
                tmp_body.startswith('https://media1.tenor.com/') or \
                tmp_body.startswith('https://media2.tenor.com/') or \
                tmp_body.startswith('https://media3.tenor.com/') or \
                tmp_body.startswith('https://i.giphy.com/') or \
                tmp_body.startswith('https://i.imgflip.com/') or \
                tmp_body.startswith('https://media1.giphy.com/') or \
                tmp_body.startswith('https://media2.giphy.com/') or \
                tmp_body.startswith('https://media3.giphy.com/') or \
                tmp_body.startswith('https://media4.giphy.com/'):
            return True
        else:
            return False
    

    I’m not even sure someone would actually drop a link like this directly into a comment. It’s not even taking into consideration whether those URLs are part of a markdown image tag.

    As Edie mentioned, if someone has a user blocked, and that user replies to someone, their comment is dropped:

    if parent_comment.author.has_blocked_user(user.id) or parent_comment.author.has_blocked_instance(user.instance_id):
        log_incoming_ap(id, APLOG_CREATE, APLOG_FAILURE, saved_json, 'Parent comment author blocked replier')
        return None
    

    For Example:

    (see Edies original comment here)

    More from Edie:

    Also add if the poster has blocked you! It is exactly as nonsense as you think.

    Example:

    I made a post in [email protected] from my account [email protected], replied to it from my other [email protected] account. Since the .social account has blocked the .zip, it doesn’t show up on .social, nor on e.g. piefed.europe.pub.

    I then made a comment from my lemmy.ml account, and replied to it from my piefed.zip account, and neither .social, nor europe.pub can see my .zip reply, but can see my lemmy.ml comment!

    But wait! There’s More!

    • PieFed defederates from Hexbear.net, Lemmygrad.ml, and Lemmy.ml out of the box.
    • The “rational discourse” sidebar that you see on the main instance is hard coded into the system.
    • Moderators of a community can kick you from a community, which unsubscribes you from it, and does not notify you.
    • I was going to say that Admins had the ability to add a weight to votes coming from other instances, but the videos that showed this are now gone, and as of v1.5.0 they have removed the instance vote weight feature, claiming it was “unused”.

    All this to say. Piefed is a silly place, and no one should bother using its software.

      • optissima (she/her)@lemmy.ml
        link
        fedilink
        arrow-up
        17
        ·
        18 days ago

        Is this software entirely vibe coded by neolib ideologues?

        I feel like it has to be. Lack of good coding practices, like hardcoding all those is_it_a_gif strings, screams vibe coded to me. You couldn’t get away with this stuff in a 200 level coding class. You know what, vibe coding is a good programming equivalent to libs: all substance with no foundations.

    • optissima (she/her)@lemmy.ml
      link
      fedilink
      arrow-up
      19
      ·
      18 days ago

      Am I reading this correctly, that if you have no defederated instances it falls back to defederating hexbear/ml/grad?

      defed_list = BannedInstances.query.filter(or_(BannedInstances.domain == 'hexbear.net',
                                                        BannedInstances.domain == 'lemmygrad.ml',
                                                        BannedInstances.domain == 'hilariouschaos.com',
                                                        BannedInstances.domain == 'lemmy.ml')).order_by(BannedInstances.domain).all()
      
      • JustSo [she/her, any]@hexbear.net
        link
        fedilink
        English
        arrow-up
        20
        ·
        18 days ago

        Pretty amusing that there’s apparently no thought to abstraction, just a bunch of brain genius “feature” additions strung together.

        • goferking (he/him)@lemmy.sdf.org
          link
          fedilink
          arrow-up
          17
          ·
          edit-2
          17 days ago

          Someone in a different release thread was going on about how piefed just made up its own federation return ignoring standards

          Found it

          https://lemmy.world/comment/21179968

          Edit, for those getting wrong thread comment in question

          It’s this kind of thinig that makes me think of PieFed as just a pile of hacks with no serious consideration for the Fediverse

          Designating which comment is an answer involves federating a new Activity:

          {  
                   "id": "https://piefed.social/activities/answer/hgb4iO4b8UAFRTn", 
                   "type": "ChooseAnswer",  
                   "actor": "https://piefed.socialz/u/rimu", 
                   "object": "https://piefed.ngrok.app/comment/224",  
                   "@context": ["https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1"],  
                   "audience": "https://crust.piefed.social/c/linux_questions",  
                   "to": ["https://www.w3.org/ns/activitystreams#Public"],  
                   "cc": ["https://crust.piefed.social/c/linux_questions"]  
          }  
          

          There are at least three different ways to implement this in a way compatible with ActivityPub:

          1. Send an “as:accept” activity with the comment as the object.
          1. Add an attribute for the comment indicating that it has been selected.
          1. Create a collection for chosen answers, add to the post object.

          And even if this type of new activity was a necessity, they could add their own extensions via a proper JSON-LD context definition. But they completely disregard JSON-LD, which means that they expect other servers to either (1) adopt their ad-hoc vocabulary or (2) ignore it completely and keep this idea that “Only PieFed has these features”.

            • optissima (she/her)@lemmy.ml
              link
              fedilink
              arrow-up
              6
              ·
              18 days ago

              I skimmed this on my phone so it’s tough to look over the whole codebase, but yes it seems like to be 100% federated you need to have a dummy instance you are defederated from? If I have time this week I might scan the codebase and see how it’s actually called.

    • goferking (he/him)@lemmy.sdf.org
      link
      fedilink
      arrow-up
      19
      ·
      edit-2
      18 days ago

      Linking to top of a comment thread that yes started with a terrible username. But it boiled down to people bringing up some of these concerns to people trying to say ml is super censorship

      Then a piefed cheerleader(spokesperson?) who tries to make everyone’s concerns just a sign they’re misunderstanding what piefed does.

      ~~https://lemmy.ml/comment/2338226~~

      https://lemmy.ml/comment/23382263

      Correct link, I accidentally removed the 3

    • Sanctus@anarchist.nexus
      link
      fedilink
      English
      arrow-up
      15
      ·
      18 days ago

      My instance is a piefed software I believe. Dammit. This shit is just unforgivable and theres no reason for it besides being a fashy. Absolutely wild. I just liked the instance ideology :.(

      • Its got some silly shit but honestly the most annoying thing is the way they handle blocks. Most of this stuff can be turned off. The fact that we’re communicating means your instance has transcended the softwares fashy nature.

        • Sanctus@anarchist.nexus
          link
          fedilink
          English
          arrow-up
          13
          ·
          18 days ago

          It still feels nasty using it now. I read this entire thread. Thanks for the very fucking confusing but interesting deep dive into the fashy software design theory. Shit is absolutely wild. I have no idea why anyone would want to even waste time implementing nonsense like this.

          • They just want reddit! They can’t accept that their concepts of freedom and democracy create the exact same controls they claim to hate.

            I just find it funny that the things I’ve complained about in the past are being removed. Vote weights are gone, community kicking is gone. I think you can still put warnings on external communities (maybe instances) which is silly.

            I’m tempted to make a hard fork of it and remove all the reddit shit and fix the blocking feature as a laugh. I wouldn’t have much interest in maintaining it though.

            • Sanctus@anarchist.nexus
              link
              fedilink
              English
              arrow-up
              9
              ·
              17 days ago

              I think what I find the most hilarious after this is all of you hexbears have great social credit according to anarchist.nexus lol meanwhile it flags Donald J Musk and UniversalMonk lol

            • ExotiqueMatter@lemmygrad.ml
              link
              fedilink
              arrow-up
              9
              ·
              18 days ago

              I’m tempted to make a hard fork of it and remove all the reddit shit and fix the blocking feature as a laugh. I wouldn’t have much interest in maintaining it though.

              With how spaghetti the code must be given all the hard-coded ad-hoc on top of each other they have going on, you might be better off just rewriting it from scratch instead.

              • RedWizard [he/him, comrade/them]@hexbear.net
                link
                fedilink
                English
                arrow-up
                5
                ·
                17 days ago

                Yeah, that’s true. I actually had this thought last night instead:

                Recreate the original reddit.com where it was just a single feed. Except with modern features like posting tags and user flairs. Basically, take Lemmy, distill it down so that it only serves a single community instead of many communities, and federate it.

                The more I think about it though, the more it falls apart I think. Like, should users be allowed to follow other communities? Then at that point am I just recreating lemmy with more steps, where you have to host a whole web stack for each community? Probably.

                • ExotiqueMatter@lemmygrad.ml
                  link
                  fedilink
                  arrow-up
                  3
                  ·
                  17 days ago

                  I think if you want something without explicit communities centered around a singular main thread, I think something like a “tread tree”, by which I mean you would have a main thread and users could either post in that thread or make a “node post” that when you click on it would take you to a sub-thread with the “node” as it’s root, might be a better option than a single linear thread.

                  Not sure how one could go about integrating that system with the rest of the fediverse though. Maybe it could treat other instances as other trees where posts would be nodes of the main thread and comments would be in the corresponding sub-threads? You would simply have to sort the instance’s posts chronologically to generate the main thread so it shouldn’t be too hard to implement, and if there are too many you could only fetch the last few and only fetch older posts when the user scrolls far enough.

                  Also, without communities and with how long that system would make the main thread, that would definitely need some neat way to navigate the tree with the keyboard and some good filter and sorting options for users to get what they want from the tree, so tags, flairs, hashtags, and ways to look them up quickly would be a must as well.

    • RedWizard [he/him, comrade/them]@hexbear.net
      link
      fedilink
      English
      arrow-up
      11
      ·
      18 days ago
      ps

      Some of my favorite stuff is just the comments about lemmy in the code.

      # old Lemmy instances ( < 0.19.8 ) allow nsfw content in nsfw communities to be flagged as sfw which makes no sense
      
      # remove unnecessary "cross-posted from..." message that Lemmy inserts (only on link posts where we have a UI showing cross-posts)
      
      # Lemmy adds the community slug as a hashtag on every post in the community, which we want to ignore
      
      (Congrats hardware@lemmy.world, you've been hardcoded)
      
      # replace lemmy's spoiler markdown left in HTML
      clean_html = clean_html.replace('<h2>:::</h2>',
                                       '<p>:::</p>')  # this is needed for lemmy.world/c/hardware's sidebar, for some reason.
      
      (I like that some how there is a Piefed flavor of markdown and a Lemmy flavor of mark down?)
      
      # this function lets local users use the more intuitive soft-breaks for newlines, but actually stores the Markdown in Lemmy-compatible format
      # Reasons for this:
      # 1. it's what any adapted Lemmy apps using an API would expect
      # 2. we've reverted to sending out Markdown in 'source' because:
      #    a. Lemmy doesn't convert '<details><summary>' back into its '::: spoiler' format
      #    b. anything coming from another PieFed instance would get reduced with html_to_text()
      #    c. raw 'https' strings in code blocks are being converted into <a> links for HTML that Lemmy then converts back into []()
      def piefed_markdown_to_lemmy_markdown(piefed_markdown: str):
          # only difference is newlines for soft breaks.
          re_breaks = re.compile(r'(\S)(\r\n)')
          lemmy_markdown = re_breaks.sub(r'\1  \2', piefed_markdown)
          return lemmy_markdown
      
      (Aw that's nice. I wonder how much they'll have to update when 1.0 comes out...)
      # change back when lemmy supports flairs
      # flair = find_flair_or_create(json_tag, post.community_id)
      # if flair:
      #    post.flair.append(flair)
      
      
      (Lemmy uses confusion. Piefed is confused!)
      # Lemmy sends 'like' for upvote and 'dislike' for down votes. Cool! When it undoes an upvote it sends an 'Undo Like'. Fine. When it undoes a downvote it sends an 'Undo Like' - not 'Undo Dislike'?!
      
      • RedWizard [he/him, comrade/them]@hexbear.net
        link
        fedilink
        English
        arrow-up
        6
        ·
        18 days ago

        Yeah, this one is funny, because it was something that was shown off in their back end video that has now been deleted (but still linked to on their site). The endpoint is still there, so you can call it from the API, but the UI elements are gone. They are correct though, it wasn’t added by the lead developer, but, it did have to be merged by them, so there is some kind of approval of the feature I guess. I could have verified this wasn’t in anymore if it wasn’t such a nightmare to set up an instance.