+3
.env.example
+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
+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
+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;