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


@[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 contentIf 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 FalseEvery 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 earnedaka 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 FalseYup. If your image contains the word
Anonymous, and contains the textNo.orN0it 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 thecurrent_user.reputation -= 1PieFed 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 adminThis 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 FalseI’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 NoneFor 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!
All this to say. Piefed is a silly place, and no one should bother using its software.
I actually misread on that, it also has to be a newly created account.
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
I’ve made the correction. I missed that too somehow.
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 that .zip reply, but can see my lemmy.ml comment!
Edit: here is the post on dbzer0, also can’t see any .zip comments
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
🥴
Ok, so if you block a person, it enforces that block for other users and even logged off users. Meaning, if me and you had a beef. I could block you, and then talk shit about you openly, and if you wanted to reply to me, you could, but it would then drop the comment and no one on my instance would see it, and no one on other instances would see it, unless you were on say, a Lemmy instance?
edit: sorry I had to rewrite that like twice because it’s so fucking confusing.
So, what I’m talking about here is this code:
if post.author.has_blocked_user(user.id) or post.author.has_blocked_instance(user.instance_id): log_incoming_ap(id, APLOG_CREATE, APLOG_FAILURE, saved_json, 'Post author blocked replier') return NoneWhere if the author of the post you are making a comment on has blocked you, the comment is dropped.
No. People on your own instance will always be able to see your comments, even if people on the piefed instance can’t.
And the reason why piefed.europe.pub cannot see the comment from my piefed.zip account is that the testing community is on piefed.social, and it doesn’t announce the comment to other instances. I think the reason why lemmy.ml can still see the comment is because piefed.zip sent it directly to lemmy.ml? But I don’t really know.
Edit: I see you edited it. My reply is still more or less correct even with the edit. I will add, that being lemmy instance isn’t going to fix it, it’s still the piefed instance’s (the instance the community is on) job to federate the comment. And if you were talking on a community not on your instance, so my reply wouldn’t be dropped by the community’s instance, every other instance except yours would know of my comments.
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
I think I figured it out. Look at process_new_content. If the content is blocked, it sends a deleted to remote instances, I think when the content isn’t allowed. Check this commit: https://codeberg.org/rimu/pyfedi/commit/ed7169b40c2b9ac0ae546d9badea45bbe57bcec5
I see, that commit was made just a week ago, after I looked at the code.
Edit: Also it’s only on main, and doesn’t seem to have been added to a release yet
Edit: Ah, no, the 2170 / 2176 line was there before
Edit: NO, it was added a week ago: https://codeberg.org/rimu/pyfedi/commit/6b692c3beec7b427494708b3ad55c30875e94f7d
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
I feel like this has been a thing for a while though. But this function
proactively_delete_reply
def proactively_delete_reply(community: Community, ap_id: str): deletor = None # Try to find a local moderator to send the Delete for moderator in community.moderators(): moderator_account = db.session.query(User).get(moderator.user_id) if moderator_account.is_local(): deletor = moderator_account break # Use admin account if there is not one. if deletor is None: deletor = db.session.query(User).get(1) if deletor: delete_id = f"https://{current_app.config['SERVER_NAME']}/activities/delete/{gibberish(15)}" to = ["https://www.w3.org/ns/activitystreams#Public"] cc = [community.public_url()] delete = { 'id': delete_id, 'type': 'Delete', 'actor': deletor.public_url(), 'object': ap_id, 'audience': community.public_url(), 'to': to, 'cc': cc, 'summary': 'Automatic deletion due to block' } announce_id = f"https://{current_app.config['SERVER_NAME']}/activities/announce/{gibberish(15)}" actor = community.public_url() cc = [community.ap_followers_url] to = ["https://www.w3.org/ns/activitystreams#Public"] announce = { 'id': announce_id, 'type': 'Announce', 'actor': actor, 'object': delete, '@context': default_context(), 'to': to, 'cc': cc } domain = furl(ap_id).host instance = find_instance_by_domain(domain) if instance and instance.inbox: send_post_request(instance.inbox, announce, community.private_key, community.public_url() + '#main-key')Is a strange way to handle blocks, right? It’s fetching either a local moderator account, or a local admin account, and then using that account to send a block command on behalf of that user account? I still don’t really know why the system doesn’t simply store the blocks locally and then check at page render if the content is blocked, and then not render it for the user who created the block. Am I understanding this correctly, that this system enforces individual user blocks on the entire community? Even remote communities?
if i’m on piefed god forbid, and i reply to a comment on an OP who has blocked me, will my own instance reject my comment? will it give me an error or will it silently drop it or what?
If you on lemmygrad.ml reply to a comment on a post where the OP has blocked you (no matter if you reply directly to the post or to another comment), you will think that the reply has gone through, it will show on lemmygrad.ml.
If the community the post is in, is on the same instance as the OP who has blocked you, the OP’s instance and other instances e.g. lemmy.ml will not see the comment. If the community is not on the same instance as the OP, other instances will see it, only the OP’s instance won’t.
(This is at least how I understand it, if I’m wrong I really hope someone will correct me)
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
no i mean suppose i have an account on piefed and i’m doing all this from that account
I completely misread your comment.
If you are on the same instance as the blocker, you will get this error message: “Your reply was not accepted because The author of the parent post has blocked the author or instance of the new reply.”
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
but if you’re on different instances, even if everybody is using pyfedi, it won’t say anything?
wow this is bad. I need to look through the piefed repo. This shit is pure comedic gold even if super toxic in practice. 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.
Yes it is, far as I’m aware.
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()Pretty amusing that there’s apparently no thought to abstraction, just a bunch of brain genius “feature” additions strung together.
Absolutely zero abstraction to be found.
well that’d create hierarchies
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
{ "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"] }lmao of course they aren’t even implementing the underlying protocol properly.
edit: lmao that whole thread is good entertainment.
In fairness the underlying protocol is fairly shit
I’m seeing mamdami comments?
Not a fediverse thread on piefed update?
Jerboa seems to be handling the link badly, but voyager linked correctly.
Just making sure as earlier did mess up the url when writing up the comment.
I think that might be at least what happens on initial load. If you never change it, that’s what it is. I could be wront though.
It is called each time site_instance_chooser_view is run, and if the filter returns empty it uses that list it seems.
Nice. So what, do you have to put a fake instance in to get around it? Or just have lemmynsfw as a recommended default first defederated instance to bypass it?
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.
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
My god cowbee is a saint
Ikr! I’m just amazed I replied longer to the same user.
Oh sorry I didn’t mean to leave you out! You’ve both got waaaaay more patience than I do
Nah all praise to cowbee!
I think this is the wrong thread?
Yeah I accidentally removed a number at the end, edited post.
https://lemmy.ml/post/41773598/23384239
And where other user started to explain why it’s okay if it doesn’t even let the person know it doesn’t leave a comment. Because it shows in piefed…
At this point wonder if the attitude they have even works properly if voting outside of piefed
(Only locally, federated piefed instances can reply to blockers just fine)
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
https://lemmy.ml/comment/23390349
Which AFAICT is incorrect as it is right now. Unless I somehow managed to create a bug where I can reply from one piefed account to another which has the first blocked.
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
You haven’t created a bug, and you have it correct. If a Piefed user blocks a remote Piefed user, and that remote Piefed user attempts to reply to them in the UI this is what happens:
in_reply_to.author.has_blocked_user(current_user.id); fails if block known locally.create_post_replycheck, may sendDeleteactivity backPiefed has no means of federating blocks. In fact, they have some TODOs to actually implement federated blocks:
app/user/routes.py:811has aTODOcomment# federate blockwith placeholder ellipsis, andapp/post/routes.py:1384has a similarTODO.app/shared/tasks/blocks.py:ban_personsendsBlockactivities exclusively for site/community bans, not user‑to‑user blocks.app/activitypub/routes.py:1520‑1526processes incoming Mastodon‑style blocks (without atargetfield) and creates localUserBlockrecords, but there is no corresponding outgoing federation.So as it stands now, Lemmy and PieFed experience the exact same thing. I guess Piefed users just don’t notice.
No it shows in piefed you can’t reply not that it shows up at all.
Just not accepting the comment was perfectly reasonable in their eyes
I cannot parse this comment, what do you mean?
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
Added more context in separate reply with a link. But basically they’re saying it is a fine way to handle it, not adding comments if blocked on piefed but on lemmy, because it shows that you can’t reply on piefed.
So like most issues brought up brushed aside completely.
And now why I’m both curious and not curious to see if it actually does some of the user control stuff properly if a user is doing it on lemmy not piefed (the reputation/attitude thing where you get pushed by the system for not behaving properly)
More opensource devs should subtly abuse their users like that.
Lmao holy shit
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.
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.
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
I remember seeing you talk in some other community and I didn’t point it out but I want to make sure you know, attitude and reputation are not the same thing.
Anyways, yeah, since we don’t have downvotes our attitude is always 1.0 (since it’s just the ratio of upvotes to downvotes) and our reputation should be pretty high since it’s only federated users that can downvote us.
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
Yeah I comment too much. That makes sense with downvotes disabled, but it also highlights how silly it all is. If they could even see you, their systems wouldn’t work anyway lol
The universal monk one makes sense simply because of how much world hates that user
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.
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.
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.
If you don’t like the software specifically, you can switch to lemmy.dbzer0.com instead. Those two instances (anarchist.nexus and lemmy.dbzer0.com) are for all intents and purposes the same instance.
Idk it seems ya’ll have removed all that you can that sucks. This seems like a battle I’d worry about if I was in PieFed proper. I am so tired, boss.
Dont worry, we’ve disabled all we can of that.
Piefed is nice in its own way, but god damn it, those “features” suck. Some of them we can’t disable.
I especially hate the “AI detection” because it’s sloppy, can’t be disabled, and some people actually use the em dash, like me.
Can it be forked and disabled? I honestly wouldn’t mind assisting in maintaining something like that cause I’d use it. But thats a lot for something that I just love the amethyst UI for lol
You can probably upstream it some of these things.
See the enable_this_comment_filter or enable_chan_image_filter options to get an idea on how to implement a similar thing.
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
It can, I never thought of having our own fork, but it could work I guess… I know a bit about it, and can keep it up to date with the latest updates. I’ll have to ask our sysadmin but thanks for the interesting idea. I think blahaj and piefed.world do something like that too
PS I created amethyst and its older predecessor, thank you xd ❤️
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'?!This seems to be many different things, could you break it up to make it clearer what fits together?
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
Actually admins.
Also apparently it doesn’t work?
ⓘ This user is suspected of being a cat. Please report any suspicious behavior.
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.
mmmm delicious software slop. thank you
A rare treat!