simple list of pds servers with open registration
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Detect software from version string at display time

Don't wait for cron to populate pds_software — infer it immediately
by checking if the version string starts with a known software name
(e.g. "millipds v0.0.5..." → millipds).

+19 -4
+19 -4
backend/routes/pages.ts
··· 8 8 countryFlag, 9 9 getSoftwareConfig, 10 10 getTrackedSoftware, 11 + PDS_SOFTWARE_REGISTRY, 11 12 } from "../../shared/constants.ts"; 12 13 import type { LatestVersionMap, PdsServer } from "../../shared/types.ts"; 13 14 import { isSafeHref } from "../../shared/url-validation.ts"; ··· 73 74 74 75 // Version check: compare against the server's own software latest version 75 76 // Extract clean semver from strings like "millipds v0.0.5.dev17+..." 76 - const softwareId = s.pds_software ?? "bluesky-pds"; 77 + const softwareId = detectSoftwareId(s); 77 78 const expectedVersion = latestVersions[softwareId]; 78 79 if (!expectedVersion) { 79 80 // Link-only software with no tracked version: benefit of the doubt ··· 309 310 const country = s.country_name || ""; 310 311 311 312 // Determine version badge class based on per-software comparison 312 - const softwareId = s.pds_software ?? "bluesky-pds"; 313 + const softwareId = detectSoftwareId(s); 313 314 const expectedVersion = latestVersions[softwareId]; 314 315 const versionText = s.version || "unknown"; 315 316 const cleanVersion = extractSemver(s.version); ··· 319 320 } 320 321 321 322 // Software cell: linked name to project URL 322 - const config = getSoftwareConfig(s.pds_software ?? "bluesky-pds"); 323 + const config = getSoftwareConfig(softwareId); 323 324 const softwareHtml = config 324 325 ? `<a class="software-link" href="${ 325 326 esc(config.projectUrl) 326 327 }" target="_blank" rel="noopener">${esc(config.displayName)}</a>` 327 - : esc(s.pds_software ?? "Bluesky PDS"); 328 + : esc(softwareId); 328 329 329 330 const users = s.user_count != null 330 331 ? (s.user_count >= 1000 ? "1000+" : String(s.user_count)) ··· 369 370 if (!version) return null; 370 371 const m = version.match(/(\d+\.\d+\.\d+)/); 371 372 return m ? m[1] : version; 373 + } 374 + 375 + /** Detect software from DB field or by inspecting the version string */ 376 + function detectSoftwareId(server: PdsServer): string { 377 + if (server.pds_software) return server.pds_software; 378 + if (!server.version) return "bluesky-pds"; 379 + // Check if version string contains a known software name (e.g. "millipds v0.0.5...") 380 + const vLower = server.version.toLowerCase(); 381 + for (const sw of PDS_SOFTWARE_REGISTRY) { 382 + if (sw.id !== "bluesky-pds" && vLower.startsWith(sw.id)) { 383 + return sw.id; 384 + } 385 + } 386 + return "bluesky-pds"; 372 387 } 373 388 374 389 function esc(str: string): string {