A tool for tailing a labelers' firehose, rehydrating, and storing records for future analysis of moderation decisions.

feat: make PLC endpoint configurable via PLC_ENDPOINT env var

Defaults to https://plc.wtf for fast DID resolution. Can be overridden to use plc.directory or custom PLC instance.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

Changed files
+10 -1
src
config
hydration
+3
.env.example
··· 6 6 PDS=bsky.social 7 7 WSS_URL=wss://your-labeler-service.com/xrpc/com.atproto.label.subscribeLabels 8 8 9 + # PLC Directory (for DID resolution) 10 + PLC_ENDPOINT=https://plc.wtf 11 + 9 12 # Blob & Image Handling 10 13 HYDRATE_BLOBS=false # Set to true to download images/videos 11 14 BLOB_STORAGE_TYPE=local # 'local' or 's3'
+6
src/config/index.ts
··· 9 9 password: z.string().min(1, "BSKY_PASSWORD is required"), 10 10 pds: z.string().default("bsky.social"), 11 11 }), 12 + plc: z.object({ 13 + endpoint: z.string().url().default("https://plc.wtf"), 14 + }), 12 15 labeler: z.object({ 13 16 wssUrl: z.string().url("WSS_URL must be a valid URL"), 14 17 }), ··· 42 45 handle: process.env.BSKY_HANDLE, 43 46 password: process.env.BSKY_PASSWORD, 44 47 pds: process.env.PDS, 48 + }, 49 + plc: { 50 + endpoint: process.env.PLC_ENDPOINT, 45 51 }, 46 52 labeler: { 47 53 wssUrl: process.env.WSS_URL,
+1 -1
src/hydration/profiles.service.ts
··· 159 159 160 160 private async resolvePds(did: string): Promise<string | null> { 161 161 try { 162 - const didDocResponse = await fetch(`https://plc.wtf/${did}`); 162 + const didDocResponse = await fetch(`${config.plc.endpoint}/${did}`); 163 163 if (!didDocResponse.ok) { 164 164 logger.warn({ did, status: didDocResponse.status }, "Failed to fetch DID document"); 165 165 return null;