PieFed 1.4 is released - emoji, federated stackoverflow and AI content filters

6 months ago by perishthethought to c/fediverse

This is our biggest release yet, including more finished tasks than any of our previous ones. Below is a summary of the highlights:

What's new

Posts & communities can be labelled as AI-generated and people can choose to hide all posts tagged that way. Very similar to how NSFW works.

Comments can be marked as an Answer, like on StackOverflow.

React to posts and comments with an emoji.

Hide an individual post from yourself, without blocking the author.

PieFed is now in the Yunohost app store, making initial setup easier.

When banned from a remote instance you cannot make local-only posts in their communities.

Honeypot to automatically IP ban badly-behaved crawlers.

https://lemmy-federate.com/ integration, making PieFed communities get more exposure.

"Share on Mastodon" menu item on posts.

Vastly improve docs for new developers, see https://codeberg.org/....

Language selection is more visible during post creation.

Tag clouds can also be viewed as a list of tags.

View post/comment markdown.

Bot accounts are not included in community statistics.

Footnote support in markdown.

Polish translation.

Better HTTP caching, which reduces dependence on Cloudflare.

Bugs

Passkey fixes.

Polls can now have up to 15 options.

User profile performance improved.

Don't allow bypassing minimum username length and post title with whitespace.

Polls and Events can no longer be posted into Lemmy communities.

API

Additional user settings can be set through the api, including Extra Fields.

Fetch url metadata.

Sort comments by controversial.

Comment search now works.

Hashtags.

Events.

Polls.

Emoji reactions on posts and comments.

See https://piefed.social/c/piefed_api for more details.

To upgrade

To upgrade from 1.3.x:

git pull  
git checkout v1.4.x  
./deploy.sh or ./deploy-docker.sh  

There is a big database migration that will take a few minutes to run. How long will vary depending on how old your instance is - older instances will have more content to process. It took ~25 minutes on piefed.social so expect it to be less than that.

Donations

PieFed is free and open-source software while operating without any advertising, monetization, or reliance on venture capital. Your donations are vital in supporting the PieFed development effort, allowing us to expand and enhance PieFed with new features.

Donations can be made via Patreon, Liberapay or Ko-fi.

The_Picard_Maneuver 39 points 6 months ago

So many features!

path: 0 21174541, hotness: undefined, score: 39, children: 0
rglullis 37 points 6 months ago

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.
  2. Add an attribute for the comment indicating that it has been selected.
  3. 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".

path: 0 21179968, hotness: undefined, score: 37, children: 57
irelephant 2 points a month ago

Add an attribute for the comment indicating that it has been selected.

Couldnt a malicious server create comments with that attribute, pretending to be an answer?

path: 0 21179968 23651099, hotness: undefined, score: 2, children: 1
rglullis 4 points a month ago

True, you'll need an activity object whose actor is the same as the original post creator to indicate the answer is accepted. The point still stands, though: the ActivityStreams vocabulary already has what's needed to enable this funcionality.

path: 0 21179968 23651099 23651262, hotness: undefined, score: 4, children: 0
drmoose 1 point 6 months ago

I'm confused - this seems like idiomatic way to add new features in activity pub? What's actually missing here?

path: 0 21179968 21192355, hotness: undefined, score: 1, children: 1
rglullis 7 points 6 months ago

What’s actually missing here?

At the very least, it is missing a context definition in the JSON-LD document that describes the term. What does a document of type ChooseAnswer mean if the provided @context entry only makes references to activitystreams and security/v1 namespaces?

More than that, it is missing a clear need. There is no need to specify a new vocabulary term when as:accept is right there: Why define a new term when something like

{  
         "id": "https://piefed.social/activities/answer/hgb4iO4b8UAFRTn", 
         "type": "Accept",  
         "actor": "https://piefed.socialz/u/rimu", 
         "object": "https://piefed.ngrok.app/comment/224",
         "target": "https://piefed.ngrok.app/post/123",  
         "@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"]  
}  

can represent the information that a comment has been accepted as a good answer to the question?

path: 0 21179968 21192355 21192685, hotness: undefined, score: 7, children: 0
Snoopy -2 points 6 months ago

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

Was it necessary ? I invite you to rewritte.

path: 0 21179968 21373593, hotness: undefined, score: -2, children: 32
rglullis 9 points 6 months ago

Off the top of my head, piefed is:

  • Sending pseudonymous actor ids to hide votes
  • "Migrating" communities by re-creating activities and objects on their own server, just rewriting the URLs and pretending the piefed server actually was the original source.
  • Integrating functionality that is hardcoded to specific instances/groups (auto-posting new communities on !newcommunities@lemmy.world)
  • Integrating lemmy-federate directly into the instance - which is a horrendous idea if you consider that will lead to every piefed instance holding every copy of the messages, even if no one in the instance actually follows or interacts with it.
  • Proposing a completely out-of-band and a custom activity protocol to notify moderation reports
  • generating a JSON-LD document filled with unspecified terms.

I am not here to gate-keep anything. If the devs are having fun working on it and if the users are happy with the product they are getting, more power to them.

It might be that piefed gets enough users and outside interest to force the team to be more discipline and mature about their practices, but to an outsider this looks more and more like a bunch of amateurs building stuff for fun, and not something that can become a viable alternative for a open social web.

path: 0 21179968 21373593 21374859, hotness: undefined, score: 9, children: 31
Skavau 2 points 6 months ago

Sending pseudonymous actor ids to hide votes

This has long been scrapped. You can choose to not federate out your own downvotes now for maximum anonymity, but this was widely disliked so it was dropped.

“Migrating” communities by re-creating activities and objects on their own server, just rewriting the URLs and pretending the piefed server actually was the original source.

Yup. Although this isn't complete in many cases, but is an entirely transparent process. I've told you this has vast fediverse support because it enables community modularity, which is needed in a world where instances will go offline, causing communities to be orphaned.

Integrating functionality that is hardcoded to specific instances/groups (auto-posting new communities on !newcommunities@lemmy.world)

This was agreed with the moderators of said community.

Integrating lemmy-federate directly into the instance - which is a horrendous idea if you consider that will lead to every piefed instance holding every copy of the messages, even if no one in the instance actually follows or interacts with it.

I'm not quite sure how this specifically functions for new instances, but I have suggested this be opt-in rather than opt-out.

path: 0 21179968 21373593 21374859 21375448, hotness: undefined, score: 2, children: 30
rglullis 6 points 6 months ago

maximum anonymity, but this was widely disliked so it was dropped.

Maximum anonymity is a lie. Users still need to trust the server admin. The truth is that the Fediverse is not a secure/private messaging platform, and attempts to hide this from the users might be well-intentioned but will bite the devs in the ass, sooner or later.

this has vast fediverse support because it enables community modularity, which is needed in a world where instances will go offline, causing communities to be orphaned.

To solve this it would be better to have the PieFed team pushing/implementing the appropriate FEPs (FEP-7952 and FEP-EF61) instead of an-hoc hack.

This was agreed with the moderators of said community.

Not the point. The point is that the devs are taking the "everything and the kitchen sink" approach to features, prioritizing any type of functionality that is minimally useful to the users instead of putting some effort on the harder stuff.

I have suggested (lemmy-federate) be opt-in rather than opt-out.

Doesn't matter. Admins will see it, think "that is nice!", turn it on and only realize later that their database is completely bloated with data that is not really needed. Meanwhile, the real problem of content discovery could be solved by implementing pull-based federation and client-side caching, but again this type of work is not being done because it's not something that the users see directly.

path: 0 21179968 21373593 21374859 21375448 21376059, hotness: undefined, score: 6, children: 29
Blaze -2 points 6 months ago path: 0 21179968 21180537, hotness: undefined, score: -2, children: 19
rglullis 33 points 6 months ago

This is not a matter of "opening a PR". The fact that they are adding features in this completely ad-hoc manner shows that they are prioritizing features for piefed over interoperability with the wider Fediverse. If my job was to go around convincing every AP developer that their approach is flawed and to fix their mistakes, I'd be doing nothing else with my life.

What I can do though is to create a framework that makes it easy to work with JSON-LD and occasionally file bug reports.


An aside: this "feel free to open a PR" - without any justification or discussion about the merit of issue at hand - is the standard passive-aggressive response from every developer who is not interested in making the change. It's sad to see that it's also becoming the go-to retort for the project cheerleaders...

path: 0 21179968 21180537 21180814, hotness: undefined, score: 33, children: 18
Blaze 14 points 6 months ago

How is creating a new Activity type preventing compatibility with the rest of the Fediverse? Is there any other Fediverse platform that has a similar feature that Piefed could have been replicated?

When you're the first one doing something with ActivityPub, you have to create it yourself. This is not perfect, and you raise valid points, hence my suggestion to engage on the Codeberg.

On the other hand, for other Piefed features inspired by existing implementations such as the emoji reactions, the feature is compatible with those platforms which already supported the feature.

Regarding your last paragraph, picking the one feature for which the implementation can be improved and saying "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" while it's clearly not true seems fully aggressive.

path: 0 21179968 21180537 21180814 21181172, hotness: undefined, score: 14, children: 12
rglullis 24 points 6 months ago

How is creating a new Activity type preventing compatibility with the rest of the Fediverse?

If they chose to use any of the 3 solutions I described, there would be no changes on the other servers to receive and parse the message. But because it uses a different type, now those serves that want to store the information about an answer being accepted have to write code specifically to handle messages from PieFed.

It also works in the other direction: if I want to send an "accept" activity for a comment, I could do it from my server and PieFed could easily understand it as well. But because they want to create their own ad-hoc solution, then they won't be able to.

When you’re the first one doing something with ActivityPub, you have to create it yourself.

No, you don't. The whole point of Linked Data and RDF is that nodes can send data to each other without having to agree on any new protocol

Piefed features inspired by existing implementations such as the emoji reactions

You are only making my point. Emojis have already a defined extension, this is why it's easier to adopt it.

picking the one feature

It's not just that. They also proposed some ad-hoc activities for moderation in the past and their "import community" works by taking posts and rewriting them as if they originated in the piefed instance. These are all signs that the devs either don't understand or don't care about JSON-LD as an standard.

path: 0 21179968 21180537 21180814 21181172 21181372, hotness: undefined, score: 24, children: 10
IndustryStandard 21 points 6 months ago

Because there is no real need for Piefed to create their own activity type besides it being slightly easier for their devs to do everything exactly the way they want.

But this is very detrimental to the fediverse because it means that everyone would have to change their software to suit the needs of Piefed.

This could be warranted if there was no way to do it with existing protocols. But as the other user stated above there is no real need for the way they are doing it. It is very hacky and prevents the rest of the fediverse from viewing this Piefed specific content unless they implement this unnecessary message type.

path: 0 21179968 21180537 21180814 21181172 21182363, hotness: undefined, score: 21, children: 0
aasatru 5 points 6 months ago

"feel free to open a PR" - without any justification or discussion about the merit of issue at hand - is the standard passive-aggressive response from every developer who is not interested in making the change.

Man, the entitlement. Especially coming from the only person I know of who is here with the explicit goal of monetizing the platform.

There's a way of voicing concerns and criticisms in a way that is constructive, helpful, and in good faith, inviting to an open discussion with concerned parties. Yours is not that.

path: 0 21179968 21180537 21180814 21183354, hotness: undefined, score: 5, children: 1
rglullis 16 points 6 months ago

Believing that the we need professional hosting providers to have a sustainable Fediverse != "Monetizing the platform".

Besides, I've already voiced similar concerns through different venues. The devs made it clear they are not interested in developing software with a focus on standards compliance. They care about throwing as many features as possible to their system.

It's fine, it's their project, they can do whatever they want. It doesn't mean that I don't have the right to have an opinion about it.

path: 0 21179968 21180537 21180814 21183354 21183728, hotness: undefined, score: 16, children: 0
db0 -1 points 5 months ago

An aside: this "feel free to open a PR" - without any justification or discussion about the merit of issue at hand - is the standard passive-aggressive response from every developer who is not interested in making the change. It's sad to see that it's also becoming the go-to retort for the project cheerleaders...

That's absolutely not true. I can't speak for all developers of course, but as someone who is juggling multiple large FOSS project, when I give that reply, 99% of the time I would like that feature, but I don't have the resources to do it myself.

path: 0 21179968 21180537 21180814 21717286, hotness: undefined, score: -1, children: 2
rglullis 5 points 5 months ago

I've added the "without any justification or discussion about the merit of issue at hand" as a qualifier...

It's totally fine if you say "yes, this looks cool but I don't have the time to do it", or even "I'm not so sure about it, but if you bring a PR we can take a better look at it".

path: 0 21179968 21180537 21180814 21717286 21718309, hotness: undefined, score: 5, children: 1
Catoblepas 11 points 6 months ago

I can’t wait for my instance to update, this all sounds great!

path: 0 21174788, hotness: undefined, score: 11, children: 0
Aids 11 points 6 months ago

I’m on voyager app signed in to Lenny.ml how would I go about using this ? Or would this have to be incorporated by the admins Lenny.ml ?

path: 0 21174390, hotness: undefined, score: 11, children: 4
Skavau 44 points 6 months ago

Piefed is an entirely different software. You would have to sign up to a piefed instance.

path: 0 21174390 21174422, hotness: undefined, score: 44, children: 0
SatyrSack 20 points 6 months ago

These also mostly look like things that Voyager would also need to add support for on their side as well. Voyager definitely supports signing into a PieFed account, browsing, commenting, and other basic features, but not all PieFed features currently work.

path: 0 21174390 21174723, hotness: undefined, score: 20, children: 0
Agent_Karyo 9 points 6 months ago

I use Piefed on Voyager, they don't really support any of the major features of Piefed.

I still use the mobile WebUI mostly.

path: 0 21174390 21179078, hotness: undefined, score: 9, children: 0
Zombie 9 points 6 months ago

How I imagine everyone dresses on Lenny.ml

path: 0 21174390 21181910, hotness: undefined, score: 9, children: 0
flamingos 6 points 6 months ago

Comments can be marked as an Answer, like on StackOverflow.

Was anything changed about how this federates? If no, what protections are in place against someone just patching their instance software to always return an "answer": true on Notes?

path: 0 21177050, hotness: undefined, score: 6, children: 2
rimu 12 points 6 months ago

That won't have any effect unless the author of the Note is the same as the author of the original post. You're welcome to try it.

The json structure used during federation does not limit the kind of access control checks we can do.

path: 0 21177050 21178280, hotness: undefined, score: 12, children: 0
wjs018 8 points 6 months ago

I don't think so, but I wasn't working on it. Tagging @rimu@piefed.social for awareness.

To do this, they would need to be an admin running a modified version of the software no? If that was really happening with any kind of regularity, it would surely be grounds for defederation.

In any case, if this were to become an issue, then I am sure we can change it. We have already had to change how community flair federates a few times to try to keep up with lemmy's PRs on the feature to try to make sure it is compatible.

path: 0 21177050 21177941, hotness: undefined, score: 8, children: 0
Goodlucksil 2 points 6 months ago

Is it me or does PieFed sound like a horse's piaffe?

path: 0 21179483, hotness: undefined, score: 2, children: 2
davel 3 points 6 months ago

I don’t think most people know what that is—including me—so it’s probably just you.

path: 0 21179483 21190808, hotness: undefined, score: 3, children: 1
Goodlucksil 2 points 6 months ago

The word in spanish is "piafar".

path: 0 21179483 21190808 21195857, hotness: undefined, score: 2, children: 0
Ludicrous0251 1 point 6 months ago

Love to see the progress and new features! Are there any apps out there keeping pace with the latest?

path: 0 21190988, hotness: undefined, score: 1, children: 0
jankforlife -21 points 6 months ago
path: 0 21175820, hotness: undefined, score: -21, children: 46
MushuChupacabra 16 points 6 months ago

Oh look the anti-commie software made by the fediverse's #1 cryptofash got updated

Oh look, a lemmy.ml user screeching.

It must suck ass to enter every conversation with that credibility-shredding username.ml kicking you square in the groin the instant you pipe up.

path: 0 21175820 21175906, hotness: undefined, score: 16, children: 31
jankforlife -5 points 6 months ago
path: 0 21175820 21175906 21177638, hotness: undefined, score: -5, children: 1
MushuChupacabra 9 points 6 months ago

Ha yeahh screeching trying to correct empire propaganda, brainwashing and numerous other walls to getting communism off the ground. O just another zionist lib .world user anyways, so its pointless

I want you to be honest:

Did your response sound very clever to you as you composed it? Subjectively, do you feel you've made a good account of yourself,,or your cause?

Lemmy.ml is to communism as is PETA is to veganism: your function appears to be to get people to really hate communism.

You may not grasp terms like marketing, but the truth of the matter is that you're fucking terrible for the brand.

path: 0 21175820 21175906 21177638 21177952, hotness: undefined, score: 9, children: 0
BrainInABox -6 points 6 months ago
path: 0 21175820 21175906 21178176, hotness: undefined, score: -6, children: 7
davel 2 points 6 months ago

You’re not helping your case by overgeneralizing this overgeneralization to include all .worlders.

path: 0 21175820 21175906 21178176 21190756, hotness: undefined, score: 2, children: 0
MushuChupacabra 1 point 6 months ago

Not our fault that .worlders have been programmed like Pavlovian dogs to have an emotional melt down everytime they see ".ml".

You are not skilled at assessing mood and tone. If you were, you'd recognize the delight in my responses. I saw the stupid comment, saw username.ml, and thought to myself:

Oh this is gonna be fun!

So thank you for your contribution to my enjoyment. If you still can't quite discern my mood, think of a cat that's playing with a mouse that's already injured.

You people literary cannot help but robotically post the exact the same thing everytime.

See my above comment on the joy I'm experiencing.

It's apparently a compulsion

You got me there. When I see something stupid posted, I enjoy heaping ridicule on the fool who posts it.

In the specific case of bitch-slapping lemmy.ml users, there's a discernible boost in pleasure.

path: 0 21175820 21175906 21178176 21183726, hotness: undefined, score: 1, children: 5
BrainInABox 3 points 6 months ago
path: 0 21175820 21175906 21178176 21183726 21190419, hotness: undefined, score: 3, children: 4
queermunist -9 points 6 months ago
path: 0 21175820 21175906 21175992, hotness: undefined, score: -9, children: 20
MushuChupacabra 7 points 6 months ago

〉reddit.world acting like they have any credibility

There is zero special about me being on lemmy.world.

Belonging to just about any instance other than lemmy.ml automatically gives you more credibility than a lemmy.ml user.

That's just how things are; I don't make the rules.

path: 0 21175820 21175906 21175992 21176458, hotness: undefined, score: 7, children: 15
kindred 9 points 6 months ago

I love this thread. It's like a quick list for who to block.

path: 0 21175820 21175906 21175992 21176458 21176575, hotness: undefined, score: 9, children: 1
queermunist 1 point 6 months ago
path: 0 21175820 21175906 21175992 21176458 21187240, hotness: undefined, score: 1, children: 12
NOT_RICK 6 points 6 months ago

If it sucks so bad why are you on a .world comm? I think ml sucks so I stay away from it. See how easy that is?

path: 0 21175820 21175906 21175992 21176104, hotness: undefined, score: 6, children: 2
queermunist 2 points 6 months ago
path: 0 21175820 21175906 21175992 21176104 21187126, hotness: undefined, score: 2, children: 1
cm0002 4 points 6 months ago path: 0 21175820 21175906 21175992 21177144, hotness: undefined, score: 4, children: 0
LibertyLizard 15 points 6 months ago

lol what

path: 0 21175820 21175951, hotness: undefined, score: 15, children: 6
jankforlife -5 points 6 months ago
path: 0 21175820 21175951 21177665, hotness: undefined, score: -5, children: 5
LibertyLizard 5 points 6 months ago

I mean the Lemmy devs are objectively assholes. You don't gotta be anti-communist to recognize that.

But if there's more to this story than just vibes I'd be interested to read about it. Did they make some statement or where did you hear this? Because I've never heard anything about this.

path: 0 21175820 21175951 21177665 21177816, hotness: undefined, score: 5, children: 2
wjs018 10 points 6 months ago

As a contributor to PieFed (by my count, 7 of those bullet points in rimu's post were done by me)...there is not more to this story as this is just some rando's perceived grievances. If there was such animosity with the lemmy devs, why would piefed.social remain federated with lemmy.ml? There are definitely ideological differences between the devs of the two platforms, but the working relationship has been cordial and I truly believe everybody involved is aligned in the goal of promoting federated alternatives to corporate social media.

path: 0 21175820 21175951 21177665 21177816 21177872, hotness: undefined, score: 10, children: 0
Skavau 5 points 6 months ago

It was revealed to him in a dream.

path: 0 21175820 21175951 21177665 21177816 21180314, hotness: undefined, score: 5, children: 0
NOT_RICK 2 points 6 months ago

I guess being a transphobe is praxis?

path: 0 21175820 21175951 21177665 21183011, hotness: undefined, score: 2, children: 0
Skavau 1 point 6 months ago

And where did you gather any of this? You think Rimu's sole and only motivation for Piefed is that and nothing else?

path: 0 21175820 21175951 21177665 21178974, hotness: undefined, score: 1, children: 0
cm0002 12 points 6 months ago

Oh no, a .ml'r accusing something of being "anti communist" when they take a stance against authoritarianism, how shocking lmao

path: 0 21175820 21177167, hotness: undefined, score: 12, children: 0
null 7 points 6 months ago

fediverse’s #1 cryptofash

What's a cryptofash?

path: 0 21175820 21176550, hotness: undefined, score: 7, children: 2
NOT_RICK 12 points 6 months ago

A Cryptofascist is a fascist that is hiding the fact that they’re a fascist. Definitely a thing that happens, generally in order to slowly win people over to their line of fascist thinking before they feel comfortable taking off their mask. Other times they just do it to sealion or other types of bad faith bullshit.

In this context it’s just a way for tankies to accuse people they’re mad at of being nazis without any credible evidence. They’re just pissy that piefed is off doing its own thing and undermining the work of the transphobic authcom Lemmy devs.

path: 0 21175820 21176550 21176894, hotness: undefined, score: 12, children: 1
BrainInABox 1 point 6 months ago
path: 0 21175820 21176550 21176894 21178156, hotness: undefined, score: 1, children: 0
Skavau 6 points 6 months ago

So how is Rimu a cryptofash?

path: 0 21175820 21178956, hotness: undefined, score: 6, children: 0
NOT_RICK 5 points 6 months ago

Lol

path: 0 21175820 21176063, hotness: undefined, score: 5, children: 0
davel 1 point 6 months ago

I got here too late to see your comments, but getting a three day community ban for gatecrashing with accusations of crypto-fascism seems pretty reasonable.

path: 0 21175820 21190936, hotness: undefined, score: 1, children: 0
fediverse
fediverse

@lemmy.world

login for more options
42580
3239
2129

A community to talk about the Fediverse and all it's related services using ActivityPub (Mastodon, Lemmy, Mbin, etc).

If you wanted to get help with moderating your own community then head over to !moderators@lemmy.world!

Rules

  • Posts must be on topic.
  • Be respectful of others.
  • Cite the sources used for graphs and other statistics.
  • Follow the general Lemmy.world rules.

Learn more at these websites: Join The Fediverse Wiki, Fediverse.info, Wikipedia Page, The Federation Info (Stats), FediDB (Stats), Sub Rehab (Reddit Migration)

go to feed...