A community-maintained directory of Bluesky Personal Data Servers (PDS).
pdslist.wisp.place
1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>PDSList - A database of Bluesky PDSes </title>
7 <link rel="stylesheet" href="styles.css">
8 <meta name="description" content="A database of Bluesky PDSes that are 'open' - by madebydanny.uk">
9 <meta property="og:image" content="/media/ogimg.png">
10 <link rel="icon" href="/media/database-solid-full.svg" type="image/x-icon"/>
11 <link rel="shortcut icon" href="/media/database-solid-full.svg" type="image/x-icon"/>
12</head>
13<body>
14 <div class="container">
15 <h1>PDSList - A database of Bluesky PDSes </h1>
16 <p>A database of Bluesky PDSes that are "open"</p>
17 <p><b>NOTE: Data on this site is sourced from the server's</b> <i>/xrpc/com.atproto.server.describeServer</i> <b>endpoint</b></p>
18 <p><a href="https://tangled.org/madebydanny.uk/pdslist#adding-your-pds">→ Add Your PDS</a></p>
19
20 <div id="loading">
21 <p>Loading database...</p>
22 </div>
23
24 <div id="content" style="display: none;">
25 <div class="stats">
26 <div class="stat">
27 <div class="stat-label">Total Servers</div>
28 <div class="stat-value" id="server-count">0</div>
29 </div>
30 <div class="stat">
31 <div class="stat-label">Showing</div>
32 <div class="stat-value" id="filtered-count">0</div>
33 </div>
34 </div>
35
36 <!-- Mobile Popup -->
37 <div id="mobile-popup" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 1000; justify-content: center; align-items: center;">
38 <div style="background: white; padding: 30px; border-radius: 8px; max-width: 400px; text-align: center; box-shadow: 0 4px 20px rgba(0,0,0,0.2);">
39 <h2 style="margin-top: 0; color: #0066cc;">Mobile Notice</h2>
40 <p>This site is best viewed on a desktop for the best experience.</p>
41 <p style="font-size: 14px; color: #666;">The database table is optimized for larger screens.</p>
42 <button id="close-mobile-popup" style="padding: 10px 20px; background: #0066cc; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 14px;">Got it, continue anyway</button>
43 </div>
44 </div>
45
46 <!-- Search and Filters -->
47 <div style="margin-bottom: 20px; padding: 15px; background: #f0f4f8; border-radius: 4px; border: 1px solid #ddd;">
48 <input type="text" id="search-input" placeholder="Search by URL, handles, maintainer, or email..." style="width: 100%; padding: 10px 12px; margin-bottom: 15px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px;">
49
50 <div style="display: flex; gap: 15px; flex-wrap: wrap; align-items: center;">
51 <label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
52 <input type="radio" name="invite-filter" value="all" checked>
53 <span>All Servers</span>
54 </label>
55 <label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
56 <input type="radio" name="invite-filter" value="yes">
57 <span>Invite Required</span>
58 </label>
59 <label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
60 <input type="radio" name="invite-filter" value="no">
61 <span>No Invite Required</span>
62 </label>
63 </div>
64 </div>
65
66 <div style="overflow-x: auto; -webkit-overflow-scrolling: touch;">
67 <table id="pds-table" border="1" cellpadding="10" cellspacing="0">
68 <thead>
69 <tr>
70 <th>URL</th>
71 <th>Handles</th>
72 <th>Maintainer</th>
73 <th>Server Location</th>
74 <th>Email</th>
75 <th>Invite Code Needed</th>
76 <th>Terms</th>
77 <th>Privacy</th>
78 </tr>
79 </thead>
80 <tbody id="table-body">
81 </tbody>
82 </table>
83 </div>
84
85 <div id="no-data" style="display: none;">
86 <p>No PDS servers found.</p>
87 </div>
88 </div>
89 </div>
90
91 <script src="app.js"></script>
92</body>
93</html>