QuickDID is a high-performance AT Protocol identity resolution service written in Rust. It provides handle-to-DID resolution with Redis-backed caching and queue processing.
1<!doctype html>
2<html lang="en">
3
4<head>
5 <meta charset="utf-8">
6 <meta name="viewport" content="width=device-width, initial-scale=1">
7 <meta name="color-scheme" content="light dark">
8
9 <!-- Primary Meta Tags -->
10 <title>QuickDID - AT Protocol Identity Resolution Service</title>
11 <meta name="title" content="QuickDID - AT Protocol Identity Resolution Service">
12 <meta name="description" content="High-performance handle-to-DID resolution service for the AT Protocol ecosystem. Resolve Bluesky and AT Protocol handles instantly.">
13 <meta name="keywords" content="ATProtocol, Bluesky, DID, handle resolution, decentralized identity, atproto">
14 <meta name="author" content="Nick Gerakines">
15
16 <!-- Open Graph / Facebook -->
17 <meta property="og:type" content="website">
18 <meta property="og:url" content="https://quickdid.smokesignal.tools/">
19 <meta property="og:title" content="QuickDID - AT Protocol Identity Resolution Service">
20 <meta property="og:description" content="High-performance handle-to-DID resolution service for the AT Protocol ecosystem. Resolve Bluesky and AT Protocol handles instantly.">
21 <meta property="og:site_name" content="QuickDID">
22
23 <!-- Twitter -->
24 <meta property="twitter:card" content="summary_large_image">
25 <meta property="twitter:url" content="https://quickdid.smokesignal.tools/">
26 <meta property="twitter:title" content="QuickDID - AT Protocol Identity Resolution Service">
27 <meta property="twitter:description" content="High-performance handle-to-DID resolution service for the AT Protocol ecosystem. Resolve Bluesky and AT Protocol handles instantly.">
28
29 <!-- Additional Meta Tags -->
30 <meta name="robots" content="index, follow">
31 <meta name="language" content="English">
32 <meta name="theme-color" content="#1976d2">
33 <link rel="canonical" href="https://quickdid.smokesignal.tools/">
34
35 <!-- Stylesheet -->
36 <link rel="stylesheet" href="/css/pico.classless.green.min.css">
37 <style>
38 .resolver-form {
39 margin: 2rem 0;
40 padding: 1.5rem;
41 background: var(--card-background-color);
42 border-radius: var(--border-radius);
43 border: 1px solid var(--muted-border-color);
44 }
45
46 .resolver-result {
47 margin-top: 1rem;
48 padding: 1.5rem;
49 background: var(--code-background-color);
50 border-radius: var(--border-radius);
51 border: 1px solid var(--muted-border-color);
52 }
53
54 .result-content {
55 background: transparent;
56 padding: 1rem;
57 overflow-x: auto;
58 white-space: pre-wrap;
59 word-break: break-word;
60 }
61
62 code {
63 padding: 0.25rem 0.5rem;
64 background: var(--code-background-color);
65 border-radius: var(--border-radius);
66 }
67
68 span {
69 display: inline-block;
70 padding: 0.25rem 0.5rem;
71 background: var(--primary);
72 color: var(--primary-inverse);
73 border-radius: var(--border-radius);
74 font-size: 0.875rem;
75 font-weight: bold;
76 margin-right: 0.5rem;
77 }
78
79 .endpoint-section {
80 margin-bottom: 3rem;
81 }
82 </style>
83</head>
84
85<body>
86 <header>
87 <hgroup>
88 <h1>QuickDID</h1>
89 <p>AT Protocol Identity Resolution Service</p>
90 </hgroup>
91 </header>
92 <main>
93 <p>QuickDID provides high-performance resolution services for the AT Protocol ecosystem.</p>
94
95 <h2>Available Endpoints</h2>
96
97 <section class="endpoint-section">
98 <h3>GET /xrpc/com.atproto.identity.resolveHandle</h3>
99 <p>Resolve an AT Protocol handle to its DID</p>
100 <p>Parameters: <code>?handle={handle}</code></p>
101
102 <h4>Try It Out</h4>
103 <form id="handleResolveForm" class="resolver-form">
104 <label for="handleInput">
105 Enter an AT Protocol handle to resolve:
106 <input type="text" id="handleInput" name="handle" placeholder="e.g., alice.bsky.social" required>
107 </label>
108 <button type="submit">Resolve Handle</button>
109 </form>
110
111 <div id="handleResult" class="resolver-result" style="display: none;">
112 <h4>Result</h4>
113 <pre id="handleResultContent" class="result-content"></pre>
114 </div>
115
116 <h4>Example Usage</h4>
117 <code>curl "https://quickdid.smokesignal.tools/xrpc/com.atproto.identity.resolveHandle?handle=ngerakines.me"</code>
118 </section>
119
120 <section class="endpoint-section">
121 <h3>GET /xrpc/com.atproto.lexicon.resolveLexicon</h3>
122 <p>Resolve an AT Protocol lexicon (NSID) to its schema</p>
123 <p>Parameters: <code>?nsid={nsid}</code></p>
124
125 <h4>Try It Out</h4>
126 <form id="lexiconResolveForm" class="resolver-form">
127 <label for="nsidInput">
128 Enter an AT Protocol NSID to resolve:
129 <input type="text" id="nsidInput" name="nsid" placeholder="e.g., app.bsky.feed.post" required>
130 </label>
131 <button type="submit">Resolve Lexicon</button>
132 </form>
133
134 <div id="lexiconResult" class="resolver-result" style="display: none;">
135 <h4>Result</h4>
136 <pre id="lexiconResultContent" class="result-content"></pre>
137 </div>
138
139 <h4>Example Usage</h4>
140 <code>curl "https://quickdid.smokesignal.tools/xrpc/com.atproto.lexicon.resolveLexicon?nsid=app.bsky.feed.post"</code>
141 </section>
142
143 <h2>Documentation</h2>
144 <p>
145 For more information, visit the
146 <a href="https://tangled.sh/@smokesignal.events/quickdid" target="_blank">
147 QuickDID repository
148 </a>
149 .
150 </p>
151 </main>
152
153 <script>
154 // Handle form submission for handle resolution
155 document.getElementById('handleResolveForm').addEventListener('submit', async (e) => {
156 e.preventDefault();
157
158 const handle = document.getElementById('handleInput').value.trim();
159 const resultDiv = document.getElementById('handleResult');
160 const resultContent = document.getElementById('handleResultContent');
161
162 // Show loading state
163 resultDiv.style.display = 'block';
164 resultContent.textContent = 'Loading...';
165
166 try {
167 // Build the request URL
168 const url = `/xrpc/com.atproto.identity.resolveHandle?handle=${encodeURIComponent(handle)}`;
169
170 // Make the GET request
171 const response = await fetch(url);
172 const data = await response.json();
173
174 // Display the result
175 if (response.ok) {
176 resultContent.textContent = JSON.stringify(data, null, 2);
177 resultContent.style.color = '';
178 } else {
179 resultContent.textContent = `Error: ${JSON.stringify(data, null, 2)}`;
180 resultContent.style.color = '#d32f2f';
181 }
182 } catch (error) {
183 resultContent.textContent = `Network Error: ${error.message}`;
184 resultContent.style.color = '#d32f2f';
185 }
186 });
187
188 // Handle form submission for lexicon resolution
189 document.getElementById('lexiconResolveForm').addEventListener('submit', async (e) => {
190 e.preventDefault();
191
192 const nsid = document.getElementById('nsidInput').value.trim();
193 const resultDiv = document.getElementById('lexiconResult');
194 const resultContent = document.getElementById('lexiconResultContent');
195
196 // Show loading state
197 resultDiv.style.display = 'block';
198 resultContent.textContent = 'Loading...';
199
200 try {
201 // Build the request URL
202 const url = `/xrpc/com.atproto.lexicon.resolveLexicon?nsid=${encodeURIComponent(nsid)}`;
203
204 // Make the GET request
205 const response = await fetch(url);
206 const data = await response.json();
207
208 // Display the result
209 if (response.ok) {
210 resultContent.textContent = JSON.stringify(data, null, 2);
211 resultContent.style.color = '';
212 } else {
213 resultContent.textContent = `Error: ${JSON.stringify(data, null, 2)}`;
214 resultContent.style.color = '#d32f2f';
215 }
216 } catch (error) {
217 resultContent.textContent = `Network Error: ${error.message}`;
218 resultContent.style.color = '#d32f2f';
219 }
220 });
221 </script>
222</body>
223
224</html>