Private follows for Bluesky.
Subscribe to the "labeler" so that you can send reports to it, and pin the feed.
Report a user with the "Other" reason type, and enter a combination of these commands:
+or+posts: follow a user's posts+rt: follow someone's reposts+r: follow someone's replies-or-all: completely unfollow someone-posts: unfollow someone's posts-rt: unfollow someone's reposts-r: unfollow someone's replies
Join multiple commands together with spaces.
The default command if you enter none is + +rt (following someone and their retweets).
To set a config option, open the database (sqlite) and execute INSERT OR REPLACE INTO config (k, v) VALUES (?, ?).
-
Start the ingester to initialize the database.
-
Choose between hosting your own mirror of
did:plcor using Bluesky's directory to resolve.Config
plc:https://plc.directory/ -
Choose a domain for your feed generator, e.g.
priv.merkletr.ee.Config
feedDid:did:web:priv.merkletr.ee,svcUrl:https://priv.merkletr.ee -
Create a main DID for the "labeler" and Bluesky account. You can do this through your PDS.
Config
mainDid:did:plc:hrxxvz6q4u67z4puuyek4qpt -
You may now start the server.
-
Add the
atproto_labelerservice to your main DID. You can do this throughgoat plcorgoat account plc.{ "did": "did:plc:hrxxvz6q4u67z4puuyek4qpt", // ... "services": { "atproto_pds": { // ... }, "atproto_labeler": { "type": "AtprotoLabeler", "endpoint": "https://priv.merkletr.ee" } } } -
Create the
app.bsky.labeler.servicelabeler definition record, e.g.:{ "$type": "app.bsky.labeler.service", "policies": { "labelValues": [] }, "reasonTypes": [ "com.atproto.moderation.defs#reasonOther", "tools.ozone.report.defs#reasonOther" ], "createdAt": "2025-11-11T00:00:00.000Z" } -
Create the
app.bsky.feed.generatorfeed generator definition record, e.g.:{ "$type": "app.bsky.feed.generator", "did": "did:web:priv.merkletr.ee", "createdAt": "2025-11-11T00:00:00.000Z", "description": "https://github.com/TechnoJo4/priv", "displayName": "Private follows" }
plc,mainDid,feedDid,svcUrl: required, detailed abovemaxFollows: maximum amount of follow relations each user may addmaxPostsPerFeed: amount of posts each user may have in their feed, pruning is enabled if this is setpruneInterval: interval in milliseconds at which the pruning process runscursor: jetstream cursor, automatically managed by the ingester