alpha
Login
or
Join now
atpota.to
/
cred.blue
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
This repository has no description
Star
0
Fork
0
Atom
Configure Feed
Issues
Pull Requests
Commits
Tags
Feed URL
Select the types of activity you want to include in your feed.
Overview
Issues
Pulls
Pipelines
add new features and styles
author
damedotblog
date
1 year ago
(Feb 27, 2025, 2:50 PM -0500)
commit
41942e07
41942e075eaf44d781f2e68fd5bfd8e92cda9879
parent
2f835208
2f835208a1e932a95d702f97aedbfee6770deeec
+1372
-36
2 changed files
Expand all
Collapse all
Unified
Split
src
components
Resources
Resources.css
Resources.js
+30
-16
src/components/Resources/Resources.css
Reviewed
···
112
112
justify-content: space-between;
113
113
}
114
114
115
115
+
/* Better category filter alignment */
116
116
+
.category-filters-container {
117
117
+
width: 100%;
118
118
+
overflow-x: auto;
119
119
+
margin-bottom: 1rem;
120
120
+
}
121
121
+
115
122
.category-filters {
116
123
display: flex;
117
117
-
flex-wrap: wrap;
124
124
+
flex-wrap: nowrap;
118
125
gap: 8px;
126
126
+
padding-bottom: 0.5rem;
127
127
+
min-width: max-content;
119
128
}
120
129
121
130
.category-filter {
131
131
+
white-space: nowrap;
122
132
background-color: var(--card-border);
123
133
color: var(--text);
124
134
border: none;
···
162
172
padding-bottom: 8px;
163
173
}
164
174
175
175
+
/* Featured section description */
176
176
+
.featured-description {
177
177
+
margin-top: -0.5rem;
178
178
+
margin-bottom: 1.5rem;
179
179
+
color: var(--text);
180
180
+
font-style: italic;
181
181
+
opacity: 0.8;
182
182
+
}
183
183
+
165
184
.resources-grid {
166
185
display: grid;
167
186
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
···
203
222
.resource-description {
204
223
font-size: 0.9rem;
205
224
color: var(--text);
206
206
-
margin: 0 0 16px 0;
225
225
+
margin: 0 0 8px 0;
207
226
flex-grow: 1;
208
227
opacity: 0.8;
209
228
}
210
229
230
230
+
/* Resource domain styling */
231
231
+
.resource-domain {
232
232
+
font-size: 0.85rem;
233
233
+
color: var(--text);
234
234
+
opacity: 0.7;
235
235
+
margin: 0 0 16px 0;
236
236
+
}
237
237
+
211
238
.resource-meta {
212
239
display: flex;
213
240
justify-content: space-between;
···
302
329
align-items: flex-start;
303
330
}
304
331
305
305
-
.category-filters {
306
306
-
margin-bottom: 12px;
332
332
+
.category-filters-container {
307
333
width: 100%;
308
308
-
justify-content: flex-start;
309
334
}
310
335
311
336
.quality-filter {
···
324
349
@media (max-width: 480px) {
325
350
.resources-page {
326
351
max-width: 100%;
327
327
-
}
328
328
-
329
329
-
.category-filters {
330
330
-
display: flex;
331
331
-
flex-wrap: wrap;
332
332
-
}
333
333
-
334
334
-
.category-filter {
335
335
-
margin-bottom: 8px;
336
336
-
width: calc(50% - 8px);
337
337
-
text-align: center;
338
352
}
339
353
}
+1342
-20
src/components/Resources/Resources.js
Reviewed
···
11
11
const [qualityFilter, setQualityFilter] = useState('All');
12
12
const [isLoading, setIsLoading] = useState(true);
13
13
14
14
-
// Resources data structure
14
14
+
// Category emojis mapping
15
15
+
const categoryEmojis = {
16
16
+
'All': '🔍',
17
17
+
'Analytics': '📊',
18
18
+
'Services': '🛠️',
19
19
+
'Data': '💾',
20
20
+
'Network': '🔄',
21
21
+
'Clients': '📱',
22
22
+
'Moderation': '🛡️',
23
23
+
'Feeds': '📰',
24
24
+
'Visualizations': '🎨',
25
25
+
'Development': '👨💻',
26
26
+
'Guides': '📚',
27
27
+
'Misc': '🔮'
28
28
+
};
29
29
+
30
30
+
// Resources data structure with expanded items from the second file
15
31
const resourcesData = [
16
32
// Analytics & Metrics - Personal Stats
17
33
{
···
20
36
category: "Analytics",
21
37
subcategory: "Personal Stats",
22
38
description: "Check how consistently you use alt text",
39
39
+
domain: "dame.is",
23
40
quality: 5,
24
41
featured: true
25
42
},
···
29
46
category: "Analytics",
30
47
subcategory: "Personal Stats",
31
48
description: "Use the KonMari method to sort through your old posts",
49
49
+
domain: "skeet.tools",
32
50
quality: 5,
33
51
featured: true
34
52
},
···
38
56
category: "Analytics",
39
57
subcategory: "Personal Stats",
40
58
description: "Visualize your social graph",
59
59
+
domain: "aviva.gay",
41
60
quality: 4,
42
61
featured: false
43
62
},
···
47
66
category: "Analytics",
48
67
subcategory: "Personal Stats",
49
68
description: "Profile metrics and fun stats",
69
69
+
domain: "skyzoo.blue",
50
70
quality: 4,
51
71
featured: false
52
72
},
···
56
76
category: "Analytics",
57
77
subcategory: "Personal Stats",
58
78
description: "Bluesky analytics",
79
79
+
domain: "skykit.blue",
59
80
quality: 4,
60
81
featured: true
61
82
},
83
83
+
{
84
84
+
name: "Skeetstats",
85
85
+
url: "https://bsky.app/profile/skeetstats.xyz",
86
86
+
category: "Analytics",
87
87
+
subcategory: "Personal Stats",
88
88
+
description: "Track your Bluesky stats",
89
89
+
domain: "skeetstats.xyz",
90
90
+
quality: 3,
91
91
+
featured: false
92
92
+
},
93
93
+
{
94
94
+
name: "Skircle",
95
95
+
url: "http://skircle.me",
96
96
+
category: "Analytics",
97
97
+
subcategory: "Personal Stats",
98
98
+
description: "Interaction circles visualization",
99
99
+
domain: "skircle.me",
100
100
+
quality: 3,
101
101
+
featured: false
102
102
+
},
103
103
+
{
104
104
+
name: "Bluesky Counter",
105
105
+
url: "https://blueskycounter.com/",
106
106
+
category: "Analytics",
107
107
+
subcategory: "Personal Stats",
108
108
+
description: "Count various metrics for your profile",
109
109
+
domain: "blueskycounter.com",
110
110
+
quality: 3,
111
111
+
featured: false
112
112
+
},
113
113
+
{
114
114
+
name: "ClearSky",
115
115
+
url: "http://clearsky.app",
116
116
+
category: "Analytics",
117
117
+
subcategory: "Personal Stats",
118
118
+
description: "Transparent block and list analytics",
119
119
+
domain: "clearsky.app",
120
120
+
quality: 4,
121
121
+
featured: true
122
122
+
},
123
123
+
{
124
124
+
name: "Blueview",
125
125
+
url: "https://blueview.app/login",
126
126
+
category: "Analytics",
127
127
+
subcategory: "Personal Stats",
128
128
+
description: "Insights and analytics for your profile",
129
129
+
domain: "blueview.app",
130
130
+
quality: 4,
131
131
+
featured: true
132
132
+
},
133
133
+
{
134
134
+
name: "Bskypt",
135
135
+
url: "https://bskypt.vercel.app",
136
136
+
category: "Analytics",
137
137
+
subcategory: "Personal Stats",
138
138
+
description: "Receipt-like profile stats",
139
139
+
domain: "vercel.app",
140
140
+
quality: 3,
141
141
+
featured: false
142
142
+
},
143
143
+
{
144
144
+
name: "Posts Heatmap Generator",
145
145
+
url: "https://bluesky-heatmap.fly.dev",
146
146
+
category: "Analytics",
147
147
+
subcategory: "Personal Stats",
148
148
+
description: "Create a heatmap of your posting activity",
149
149
+
domain: "fly.dev",
150
150
+
quality: 3,
151
151
+
featured: false
152
152
+
},
153
153
+
{
154
154
+
name: "Dopplersky",
155
155
+
url: "https://dopplersky.com",
156
156
+
category: "Analytics",
157
157
+
subcategory: "Personal Stats",
158
158
+
description: "Find your Twitter-to-Bluesky doppelgangers",
159
159
+
domain: "dopplersky.com",
160
160
+
quality: 3,
161
161
+
featured: false
162
162
+
},
163
163
+
{
164
164
+
name: "Skystats",
165
165
+
url: "https://skystats.mariozechner.at/",
166
166
+
category: "Analytics",
167
167
+
subcategory: "Personal Stats",
168
168
+
description: "Comprehensive profile statistics",
169
169
+
domain: "mariozechner.at",
170
170
+
quality: 3,
171
171
+
featured: false
172
172
+
},
173
173
+
{
174
174
+
name: "Best Time to Post",
175
175
+
url: "https://bluesky.notemation.com/best-time-to-post",
176
176
+
category: "Analytics",
177
177
+
subcategory: "Personal Stats",
178
178
+
description: "See your social graph's active times",
179
179
+
domain: "notemation.com",
180
180
+
quality: 3,
181
181
+
featured: false
182
182
+
},
62
183
63
184
// Analytics & Metrics - Platform Stats
64
185
{
···
67
188
category: "Analytics",
68
189
subcategory: "Platform Stats",
69
190
description: "Realtime user growth dashboard",
191
191
+
domain: "nat.vg",
70
192
quality: 4,
71
193
featured: false
72
194
},
···
76
198
category: "Analytics",
77
199
subcategory: "Platform Stats",
78
200
description: "Real-time emoji usage data",
201
201
+
domain: "bsky.sh",
202
202
+
quality: 3,
203
203
+
featured: false
204
204
+
},
205
205
+
{
206
206
+
name: "Bluesky Post Count and Author Stats",
207
207
+
url: "https://bsky.jazco.dev/stats",
208
208
+
category: "Analytics",
209
209
+
subcategory: "Platform Stats",
210
210
+
description: "Platform-wide statistics",
211
211
+
domain: "jazco.dev",
212
212
+
quality: 3,
213
213
+
featured: false
214
214
+
},
215
215
+
{
216
216
+
name: "Bluesky Population Size Guide",
217
217
+
url: "https://observablehq.com/d/58c2cd234ca376b8",
218
218
+
category: "Analytics",
219
219
+
subcategory: "Platform Stats",
220
220
+
description: "Visual guide to Bluesky user population",
221
221
+
domain: "observablehq.com",
222
222
+
quality: 3,
223
223
+
featured: false
224
224
+
},
225
225
+
{
226
226
+
name: "Top 500 Users List",
227
227
+
url: "https://vqv.app/index.html",
228
228
+
category: "Analytics",
229
229
+
subcategory: "Platform Stats",
230
230
+
description: "List of top Bluesky users by followers",
231
231
+
domain: "vqv.app",
232
232
+
quality: 3,
233
233
+
featured: false
234
234
+
},
235
235
+
{
236
236
+
name: "Handles Directory",
237
237
+
url: "https://blue.mackuba.eu/directory/",
238
238
+
category: "Analytics",
239
239
+
subcategory: "Platform Stats",
240
240
+
description: "Browse Bluesky handles by domain",
241
241
+
domain: "mackuba.eu",
242
242
+
quality: 3,
243
243
+
featured: false
244
244
+
},
245
245
+
{
246
246
+
name: "BlueTube",
247
247
+
url: "https://bluetube.fyi/",
248
248
+
category: "Analytics",
249
249
+
subcategory: "Platform Stats",
250
250
+
description: "Hottest YouTube links on Bluesky",
251
251
+
domain: "bluetube.fyi",
252
252
+
quality: 3,
253
253
+
featured: false
254
254
+
},
255
255
+
{
256
256
+
name: "BSkyCharts",
257
257
+
url: "https://bskycharts.edavis.dev/bluesky-day.html",
258
258
+
category: "Analytics",
259
259
+
subcategory: "Platform Stats",
260
260
+
description: "Charts and statistics for Bluesky",
261
261
+
domain: "edavis.dev",
79
262
quality: 3,
80
263
featured: false
81
264
},
···
87
270
category: "Services",
88
271
subcategory: "AppViews",
89
272
description: "Manage your muted words in bulk",
273
273
+
domain: "mutesky.app",
90
274
quality: 4,
91
275
featured: false
92
276
},
···
96
280
category: "Services",
97
281
subcategory: "AppViews",
98
282
description: "Decentralized link aggregator",
283
283
+
domain: "frontpage.fyi",
99
284
quality: 5,
100
285
featured: true
101
286
},
102
287
{
103
103
-
name: "Graze",
104
104
-
url: "https://www.graze.social/",
105
105
-
category: "Feeds",
106
106
-
subcategory: "Feed Tools",
107
107
-
description: "No-Code feed creator",
108
108
-
quality: 5,
288
288
+
name: "WhiteWind",
289
289
+
url: "https://whtwnd.com/about",
290
290
+
category: "Services",
291
291
+
subcategory: "AppViews",
292
292
+
description: "Markdown blogging service",
293
293
+
domain: "whtwnd.com",
294
294
+
quality: 4,
295
295
+
featured: false
296
296
+
},
297
297
+
{
298
298
+
name: "Skylights",
299
299
+
url: "https://skylights.my/profile/watwa.re",
300
300
+
category: "Services",
301
301
+
subcategory: "AppViews",
302
302
+
description: "Track and review favorite media",
303
303
+
domain: "skylights.my",
304
304
+
quality: 4,
305
305
+
featured: false
306
306
+
},
307
307
+
{
308
308
+
name: "BookHive",
309
309
+
url: "https://bookhive.buzz/",
310
310
+
category: "Services",
311
311
+
subcategory: "AppViews",
312
312
+
description: "Goodreads on AT Proto",
313
313
+
domain: "bookhive.buzz",
314
314
+
quality: 4,
315
315
+
featured: false
316
316
+
},
317
317
+
{
318
318
+
name: "Linkat",
319
319
+
url: "https://linkat.blue",
320
320
+
category: "Services",
321
321
+
subcategory: "AppViews",
322
322
+
description: "Link in bio for Bluesky",
323
323
+
domain: "linkat.blue",
324
324
+
quality: 4,
325
325
+
featured: false
326
326
+
},
327
327
+
{
328
328
+
name: "psky.social",
329
329
+
url: "https://psky.social",
330
330
+
category: "Services",
331
331
+
subcategory: "AppViews",
332
332
+
description: "Chatroom for Bluesky users",
333
333
+
domain: "psky.social",
334
334
+
quality: 3,
335
335
+
featured: false
336
336
+
},
337
337
+
{
338
338
+
name: "atproto.camp",
339
339
+
url: "https://atproto.camp",
340
340
+
category: "Services",
341
341
+
subcategory: "AppViews",
342
342
+
description: "Earn badges for protocol activity",
343
343
+
domain: "atproto.camp",
344
344
+
quality: 3,
345
345
+
featured: false
346
346
+
},
347
347
+
{
348
348
+
name: "pinksea.art",
349
349
+
url: "https://pinksea.art/",
350
350
+
category: "Services",
351
351
+
subcategory: "AppViews",
352
352
+
description: "Oekaki (doodle) on the ATprotocol",
353
353
+
domain: "pinksea.art",
354
354
+
quality: 4,
109
355
featured: true
110
356
},
357
357
+
{
358
358
+
name: "poll.blue",
359
359
+
url: "https://poll.blue/post",
360
360
+
category: "Services",
361
361
+
subcategory: "AppViews",
362
362
+
description: "Polls for Bluesky",
363
363
+
domain: "poll.blue",
364
364
+
quality: 4,
365
365
+
featured: false
366
366
+
},
367
367
+
{
368
368
+
name: "Blue Bots, Done Quick",
369
369
+
url: "http://bluebotsdonequick.com",
370
370
+
category: "Services",
371
371
+
subcategory: "AppViews",
372
372
+
description: "Create bots for Bluesky easily",
373
373
+
domain: "bluebotsdonequick.com",
374
374
+
quality: 3,
375
375
+
featured: false
376
376
+
},
377
377
+
{
378
378
+
name: "teal.fm",
379
379
+
url: "https://teal.fm",
380
380
+
category: "Services",
381
381
+
subcategory: "AppViews",
382
382
+
description: "Music tracking and discovery",
383
383
+
domain: "teal.fm",
384
384
+
quality: 4,
385
385
+
featured: false
386
386
+
},
387
387
+
{
388
388
+
name: "Hugfairy",
389
389
+
url: "https://bsky.app/profile/hugfairy.bsky.social",
390
390
+
category: "Services",
391
391
+
subcategory: "AppViews",
392
392
+
description: "Send a hug to someone on Bluesky",
393
393
+
domain: "bsky.app",
394
394
+
quality: 3,
395
395
+
featured: false
396
396
+
},
397
397
+
{
398
398
+
name: "BlueNotify",
399
399
+
url: "https://apps.apple.com/us/app/bluenotify/id6738239349",
400
400
+
category: "Services",
401
401
+
subcategory: "AppViews",
402
402
+
description: "Post notifications for Bluesky",
403
403
+
domain: "apple.com",
404
404
+
quality: 4,
405
405
+
featured: false
406
406
+
},
407
407
+
{
408
408
+
name: "ATFile",
409
409
+
url: "https://github.com/ziodotsh/atfile",
410
410
+
category: "Services",
411
411
+
subcategory: "AppViews",
412
412
+
description: "Share files on a PDS",
413
413
+
domain: "github.com",
414
414
+
quality: 3,
415
415
+
featured: false
416
416
+
},
417
417
+
{
418
418
+
name: "Bluecast",
419
419
+
url: "https://www.bluecast.app",
420
420
+
category: "Services",
421
421
+
subcategory: "AppViews",
422
422
+
description: "Real-time audio streaming service",
423
423
+
domain: "bluecast.app",
424
424
+
quality: 4,
425
425
+
featured: false
426
426
+
},
427
427
+
{
428
428
+
name: "Blue Place",
429
429
+
url: "https://place.blue",
430
430
+
category: "Services",
431
431
+
subcategory: "AppViews",
432
432
+
description: "r/place, but for Bluesky",
433
433
+
domain: "place.blue",
434
434
+
quality: 3,
435
435
+
featured: false
436
436
+
},
437
437
+
{
438
438
+
name: "pastesphere",
439
439
+
url: "https://pastesphere.link/",
440
440
+
category: "Services",
441
441
+
subcategory: "AppViews",
442
442
+
description: "Paste-bin on the AT Protocol",
443
443
+
domain: "pastesphere.link",
444
444
+
quality: 3,
445
445
+
featured: false
446
446
+
},
447
447
+
{
448
448
+
name: "Recipe Exchange",
449
449
+
url: "https://recipe.exchange/",
450
450
+
category: "Services",
451
451
+
subcategory: "AppViews",
452
452
+
description: "Share and discover recipes",
453
453
+
domain: "recipe.exchange",
454
454
+
quality: 4,
455
455
+
featured: false
456
456
+
},
457
457
+
{
458
458
+
name: "skywatched",
459
459
+
url: "https://skywatched.app/",
460
460
+
category: "Services",
461
461
+
subcategory: "AppViews",
462
462
+
description: "Review and track movies",
463
463
+
domain: "skywatched.app",
464
464
+
quality: 4,
465
465
+
featured: false
466
466
+
},
467
467
+
{
468
468
+
name: "Ruthub",
469
469
+
url: "https://ruthub.com",
470
470
+
category: "Services",
471
471
+
subcategory: "AppViews",
472
472
+
description: "Kanban on AT Proto",
473
473
+
domain: "ruthub.com",
474
474
+
quality: 3,
475
475
+
featured: false
476
476
+
},
477
477
+
{
478
478
+
name: "dazzle.fm",
479
479
+
url: "https://dazzle.fm/trends",
480
480
+
category: "Services",
481
481
+
subcategory: "AppViews",
482
482
+
description: "What's happening on Bluesky",
483
483
+
domain: "dazzle.fm",
484
484
+
quality: 3,
485
485
+
featured: false
486
486
+
},
111
487
112
488
// Data Management
113
489
{
···
116
492
category: "Data",
117
493
subcategory: "Management",
118
494
description: "Bulk retroactive thread gating",
495
495
+
domain: "kelinci.net",
119
496
quality: 3,
120
497
featured: false
121
498
},
···
125
502
category: "Data",
126
503
subcategory: "Management",
127
504
description: "Auto-delete old skeets",
505
505
+
domain: "p8.lu",
506
506
+
quality: 4,
507
507
+
featured: false
508
508
+
},
509
509
+
{
510
510
+
name: "Skeetgen",
511
511
+
url: "https://mary-ext.github.io/skeetgen/",
512
512
+
category: "Data",
513
513
+
subcategory: "Management",
514
514
+
description: "Generate an easily viewable archive of your posts",
515
515
+
domain: "github.io",
516
516
+
quality: 4,
517
517
+
featured: false
518
518
+
},
519
519
+
{
520
520
+
name: "Profile Cleaner",
521
521
+
url: "https://bsky.jazco.dev/cleanup",
522
522
+
category: "Data",
523
523
+
subcategory: "Management",
524
524
+
description: "Clean up your Bluesky profile",
525
525
+
domain: "jazco.dev",
526
526
+
quality: 3,
527
527
+
featured: false
528
528
+
},
529
529
+
{
530
530
+
name: "Backup Tool",
531
531
+
url: "https://observablehq.com/@aendra/bluesky-backup-tool",
532
532
+
category: "Data",
533
533
+
subcategory: "Management",
534
534
+
description: "Back up your Bluesky data",
535
535
+
domain: "observablehq.com",
536
536
+
quality: 3,
537
537
+
featured: false
538
538
+
},
539
539
+
{
540
540
+
name: "Tweet Deleter",
541
541
+
url: "http://tweetdeleter.com",
542
542
+
category: "Data",
543
543
+
subcategory: "Management",
544
544
+
description: "Delete your old tweets",
545
545
+
domain: "tweetdeleter.com",
546
546
+
quality: 3,
547
547
+
featured: false
548
548
+
},
549
549
+
{
550
550
+
name: "redact.dev",
551
551
+
url: "http://redact.dev",
552
552
+
category: "Data",
553
553
+
subcategory: "Management",
554
554
+
description: "Delete posts from various platforms",
555
555
+
domain: "redact.dev",
556
556
+
quality: 3,
557
557
+
featured: false
558
558
+
},
559
559
+
{
560
560
+
name: "Blockparty",
561
561
+
url: "http://blockpartyapp.com",
562
562
+
category: "Data",
563
563
+
subcategory: "Management",
564
564
+
description: "Manage blocks across platforms",
565
565
+
domain: "blockpartyapp.com",
566
566
+
quality: 3,
567
567
+
featured: false
568
568
+
},
569
569
+
{
570
570
+
name: "Porto",
571
571
+
url: "https://chromewebstore.google.com/detail/porto-import-your-tweets/ckilhjdflnaakopknngigiggfpnjaaop",
572
572
+
category: "Data",
573
573
+
subcategory: "Management",
574
574
+
description: "Import your tweets to Bluesky",
575
575
+
domain: "google.com",
576
576
+
quality: 4,
577
577
+
featured: false
578
578
+
},
579
579
+
{
580
580
+
name: "BlueArk",
581
581
+
url: "https://blueark.app",
582
582
+
category: "Data",
583
583
+
subcategory: "Management",
584
584
+
description: "Move your tweets to Bluesky",
585
585
+
domain: "blueark.app",
128
586
quality: 4,
129
587
featured: false
130
588
},
···
136
594
category: "Network",
137
595
subcategory: "Management",
138
596
description: "Find and analyze your network connections",
597
597
+
domain: "theo.io",
139
598
quality: 4,
140
599
featured: true
141
600
},
···
145
604
category: "Network",
146
605
subcategory: "Management",
147
606
description: "Track and manage who you're following",
607
607
+
domain: "cam.fyi",
148
608
quality: 4,
149
609
featured: true
150
610
},
611
611
+
{
612
612
+
name: "Sky Follower Bridge",
613
613
+
url: "https://chromewebstore.google.com/detail/sky-follower-bridge/behhbpbpmailcnfbjagknjngnfdojpko/",
614
614
+
category: "Network",
615
615
+
subcategory: "Management",
616
616
+
description: "Find your Twitter follows",
617
617
+
domain: "google.com",
618
618
+
quality: 4,
619
619
+
featured: false
620
620
+
},
621
621
+
{
622
622
+
name: "StarterPacks.net",
623
623
+
url: "https://www.starterpacks.net",
624
624
+
category: "Network",
625
625
+
subcategory: "Management",
626
626
+
description: "Explore starter packs",
627
627
+
domain: "starterpacks.net",
628
628
+
quality: 4,
629
629
+
featured: false
630
630
+
},
631
631
+
{
632
632
+
name: "Follower Explorer",
633
633
+
url: "https://bluesky-followers.advaith.io",
634
634
+
category: "Network",
635
635
+
subcategory: "Management",
636
636
+
description: "Explore your followers",
637
637
+
domain: "advaith.io",
638
638
+
quality: 3,
639
639
+
featured: false
640
640
+
},
641
641
+
{
642
642
+
name: "cleanfollow",
643
643
+
url: "https://cleanfollow-bsky.pages.dev",
644
644
+
category: "Network",
645
645
+
subcategory: "Management",
646
646
+
description: "Select inactive or blocked accounts to unfollow",
647
647
+
domain: "pages.dev",
648
648
+
quality: 3,
649
649
+
featured: false
650
650
+
},
651
651
+
{
652
652
+
name: "Bluesky Follower Info",
653
653
+
url: "https://chromewebstore.google.com/detail/bluesky-follower-info/fokpfcfpgdlmnbjajbdeofkemfblbnbh",
654
654
+
category: "Network",
655
655
+
subcategory: "Management",
656
656
+
description: "Chrome extension for follower info",
657
657
+
domain: "google.com",
658
658
+
quality: 3,
659
659
+
featured: false
660
660
+
},
661
661
+
{
662
662
+
name: "unfollow.blue",
663
663
+
url: "https://unfollow.blue/",
664
664
+
category: "Network",
665
665
+
subcategory: "Management",
666
666
+
description: "Track unfollows and follows",
667
667
+
domain: "unfollow.blue",
668
668
+
quality: 3,
669
669
+
featured: false
670
670
+
},
671
671
+
{
672
672
+
name: "Blockenheimer",
673
673
+
url: "https://blockenheimer.click/",
674
674
+
category: "Network",
675
675
+
subcategory: "Management",
676
676
+
description: "Block large amounts of accounts",
677
677
+
domain: "blockenheimer.click",
678
678
+
quality: 3,
679
679
+
featured: false
680
680
+
},
681
681
+
{
682
682
+
name: "Convert Starter Pack to List",
683
683
+
url: "https://nws-bot.us/bskyStarterPack.php",
684
684
+
category: "Network",
685
685
+
subcategory: "Management",
686
686
+
description: "Convert starter packs to lists",
687
687
+
domain: "nws-bot.us",
688
688
+
quality: 3,
689
689
+
featured: false
690
690
+
},
691
691
+
{
692
692
+
name: "List Copier",
693
693
+
url: "https://bsky.cam.fyi/lists",
694
694
+
category: "Network",
695
695
+
subcategory: "Management",
696
696
+
description: "Copy lists between accounts",
697
697
+
domain: "cam.fyi",
698
698
+
quality: 3,
699
699
+
featured: false
700
700
+
},
701
701
+
{
702
702
+
name: "listfluff",
703
703
+
url: "https://github.com/mollypup/listfluff?tab=readme-ov-file",
704
704
+
category: "Network",
705
705
+
subcategory: "Management",
706
706
+
description: "Add and remove users from Bluesky lists",
707
707
+
domain: "github.com",
708
708
+
quality: 3,
709
709
+
featured: false
710
710
+
},
711
711
+
{
712
712
+
name: "Which Pack",
713
713
+
url: "https://whichpack.com/",
714
714
+
category: "Network",
715
715
+
subcategory: "Management",
716
716
+
description: "See what starterpacks you're in",
717
717
+
domain: "whichpack.com",
718
718
+
quality: 3,
719
719
+
featured: false
720
720
+
},
721
721
+
{
722
722
+
name: "AT Orbital Laser",
723
723
+
url: "https://at-orbital-laser.aesthr.com/",
724
724
+
category: "Network",
725
725
+
subcategory: "Management",
726
726
+
description: "Block a user and their followers",
727
727
+
domain: "aesthr.com",
728
728
+
quality: 3,
729
729
+
featured: false
730
730
+
},
151
731
152
732
// Alternative Clients
153
733
{
···
156
736
category: "Clients",
157
737
subcategory: "Alternative",
158
738
description: "TweetDeck for Bluesky",
739
739
+
domain: "deck.blue",
159
740
quality: 4,
160
741
featured: false
161
742
},
···
165
746
category: "Clients",
166
747
subcategory: "Alternative",
167
748
description: "Alternative mobile client",
749
749
+
domain: "graysky.app",
168
750
quality: 5,
169
751
featured: false
170
752
},
753
753
+
{
754
754
+
name: "Skeets App",
755
755
+
url: "https://www.skeetsapp.com",
756
756
+
category: "Clients",
757
757
+
subcategory: "Alternative",
758
758
+
description: "Third-party Bluesky client",
759
759
+
domain: "skeetsapp.com",
760
760
+
quality: 4,
761
761
+
featured: false
762
762
+
},
763
763
+
{
764
764
+
name: "Ouranos",
765
765
+
url: "https://useouranos.app/",
766
766
+
category: "Clients",
767
767
+
subcategory: "Alternative",
768
768
+
description: "Alternative Bluesky client",
769
769
+
domain: "useouranos.app",
770
770
+
quality: 4,
771
771
+
featured: false
772
772
+
},
773
773
+
{
774
774
+
name: "Butterfly",
775
775
+
url: "https://apps.apple.com/us/app/butterfly-for-bluesky/id6738070758",
776
776
+
category: "Clients",
777
777
+
subcategory: "Alternative",
778
778
+
description: "Bluesky for Apple Watch",
779
779
+
domain: "apple.com",
780
780
+
quality: 3,
781
781
+
featured: false
782
782
+
},
783
783
+
{
784
784
+
name: "Ucho-ten",
785
785
+
url: "https://app.ucho-ten.net/",
786
786
+
category: "Clients",
787
787
+
subcategory: "Alternative",
788
788
+
description: "Alternative Bluesky client",
789
789
+
domain: "ucho-ten.net",
790
790
+
quality: 4,
791
791
+
featured: false
792
792
+
},
793
793
+
{
794
794
+
name: "Swablu",
795
795
+
url: "https://swablu.pages.dev/#/login",
796
796
+
category: "Clients",
797
797
+
subcategory: "Alternative",
798
798
+
description: "Web-based Bluesky client",
799
799
+
domain: "pages.dev",
800
800
+
quality: 3,
801
801
+
featured: false
802
802
+
},
803
803
+
{
804
804
+
name: "Bluejeans",
805
805
+
url: "https://bluejeans.app/",
806
806
+
category: "Clients",
807
807
+
subcategory: "Alternative",
808
808
+
description: "Alternative Bluesky client",
809
809
+
domain: "bluejeans.app",
810
810
+
quality: 3,
811
811
+
featured: false
812
812
+
},
171
813
172
814
// Labelers & Moderation
173
815
{
···
176
818
category: "Moderation",
177
819
subcategory: "Labelers",
178
820
description: "Labels political content",
821
821
+
domain: "bsky.app",
179
822
quality: 4,
180
823
featured: true
181
824
},
···
185
828
category: "Moderation",
186
829
subcategory: "Labelers",
187
830
description: "Adds pronoun information to profiles",
831
831
+
domain: "bsky.app",
188
832
quality: 4,
189
833
featured: true
190
834
},
835
835
+
{
836
836
+
name: "Labeler List",
837
837
+
url: "https://blue.mackuba.eu/labellers/",
838
838
+
category: "Moderation",
839
839
+
subcategory: "Labelers",
840
840
+
description: "Directory of available labelers",
841
841
+
domain: "mackuba.eu",
842
842
+
quality: 4,
843
843
+
featured: false
844
844
+
},
845
845
+
{
846
846
+
name: "Label Scanner",
847
847
+
url: "https://blue.mackuba.eu/scanner/",
848
848
+
category: "Moderation",
849
849
+
subcategory: "Labelers",
850
850
+
description: "See what labels are on your account",
851
851
+
domain: "mackuba.eu",
852
852
+
quality: 4,
853
853
+
featured: false
854
854
+
},
855
855
+
{
856
856
+
name: "Identity Decentralisation",
857
857
+
url: "https://bsky.app/profile/decentralise.goeo.lol",
858
858
+
category: "Moderation",
859
859
+
subcategory: "Labelers",
860
860
+
description: "Labeler for decentralization identification",
861
861
+
domain: "bsky.app",
862
862
+
quality: 3,
863
863
+
featured: false
864
864
+
},
865
865
+
{
866
866
+
name: "Official Moderation",
867
867
+
url: "https://bsky.app/profile/moderation.bsky.app",
868
868
+
category: "Moderation",
869
869
+
subcategory: "Labelers",
870
870
+
description: "Official Bluesky moderation account",
871
871
+
domain: "bsky.app",
872
872
+
quality: 5,
873
873
+
featured: false
874
874
+
},
875
875
+
{
876
876
+
name: "Profile Records",
877
877
+
url: "https://bsky.app/profile/profile-labels.bossett.social",
878
878
+
category: "Moderation",
879
879
+
subcategory: "Labelers",
880
880
+
description: "Profile record labeler",
881
881
+
domain: "bsky.app",
882
882
+
quality: 3,
883
883
+
featured: false
884
884
+
},
885
885
+
{
886
886
+
name: "Skywatch",
887
887
+
url: "https://bsky.app/profile/skywatch.blue",
888
888
+
category: "Moderation",
889
889
+
subcategory: "Labelers",
890
890
+
description: "Multipurpose labeler",
891
891
+
domain: "bsky.app",
892
892
+
quality: 4,
893
893
+
featured: false
894
894
+
},
895
895
+
{
896
896
+
name: "Khronos",
897
897
+
url: "https://bsky.app/profile/khronos.world",
898
898
+
category: "Moderation",
899
899
+
subcategory: "Labelers",
900
900
+
description: "Time zone labels",
901
901
+
domain: "bsky.app",
902
902
+
quality: 3,
903
903
+
featured: false
904
904
+
},
905
905
+
{
906
906
+
name: "Blacksky",
907
907
+
url: "https://bsky.app/profile/blacksky.app",
908
908
+
category: "Moderation",
909
909
+
subcategory: "Labelers",
910
910
+
description: "Content moderation labeler",
911
911
+
domain: "bsky.app",
912
912
+
quality: 3,
913
913
+
featured: false
914
914
+
},
915
915
+
{
916
916
+
name: "US Gov Contributions",
917
917
+
url: "https://bsky.app/profile/us-gov-funding.bsky.social",
918
918
+
category: "Moderation",
919
919
+
subcategory: "Labelers",
920
920
+
description: "Labels users with government funding",
921
921
+
domain: "bsky.app",
922
922
+
quality: 3,
923
923
+
featured: false
924
924
+
},
925
925
+
{
926
926
+
name: "Screenshots",
927
927
+
url: "https://bsky.app/profile/xblock.aendra.dev",
928
928
+
category: "Moderation",
929
929
+
subcategory: "Labelers",
930
930
+
description: "Labels screenshots",
931
931
+
domain: "bsky.app",
932
932
+
quality: 3,
933
933
+
featured: false
934
934
+
},
935
935
+
{
936
936
+
name: "AI Imagery",
937
937
+
url: "https://bsky.app/profile/aimod.social",
938
938
+
category: "Moderation",
939
939
+
subcategory: "Labelers",
940
940
+
description: "Labels AI-generated imagery",
941
941
+
domain: "bsky.app",
942
942
+
quality: 4,
943
943
+
featured: false
944
944
+
},
945
945
+
{
946
946
+
name: "Content Creator Labels",
947
947
+
url: "https://bsky.app/profile/creatorlabeler.bsky.social",
948
948
+
category: "Moderation",
949
949
+
subcategory: "Labelers",
950
950
+
description: "Labels content creators",
951
951
+
domain: "bsky.app",
952
952
+
quality: 3,
953
953
+
featured: false
954
954
+
},
955
955
+
{
956
956
+
name: "Shiny Posts",
957
957
+
url: "https://bsky.app/profile/shinyposts.awoo.blue",
958
958
+
category: "Moderation",
959
959
+
subcategory: "Labelers",
960
960
+
description: "Labels visually distinct posts",
961
961
+
domain: "bsky.app",
962
962
+
quality: 3,
963
963
+
featured: false
964
964
+
},
965
965
+
{
966
966
+
name: "Mushroom Server Labels",
967
967
+
url: "https://bsky.app/profile/mushroom-labeler.bsky.social",
968
968
+
category: "Moderation",
969
969
+
subcategory: "Labelers",
970
970
+
description: "Labels mushroom content",
971
971
+
domain: "bsky.app",
972
972
+
quality: 3,
973
973
+
featured: false
974
974
+
},
975
975
+
{
976
976
+
name: "Nations",
977
977
+
url: "https://bsky.app/profile/kickflip.renahlee.com",
978
978
+
category: "Moderation",
979
979
+
subcategory: "Labelers",
980
980
+
description: "Labels users by country/nationality",
981
981
+
domain: "bsky.app",
982
982
+
quality: 3,
983
983
+
featured: false
984
984
+
},
191
985
192
986
// Feeds & Discovery
193
987
{
988
988
+
name: "Graze",
989
989
+
url: "https://www.graze.social/",
990
990
+
category: "Feeds",
991
991
+
subcategory: "Feed Tools",
992
992
+
description: "No-Code feed creator",
993
993
+
domain: "graze.social",
994
994
+
quality: 5,
995
995
+
featured: true
996
996
+
},
997
997
+
{
998
998
+
name: "goodfeeds.com",
999
999
+
url: "https://goodfeeds.co/all?p=1",
1000
1000
+
category: "Feeds",
1001
1001
+
subcategory: "Feed Tools",
1002
1002
+
description: "Discover feeds",
1003
1003
+
domain: "goodfeeds.co",
1004
1004
+
quality: 4,
1005
1005
+
featured: false
1006
1006
+
},
1007
1007
+
{
1008
1008
+
name: "Bluefeed",
1009
1009
+
url: "https://www.bluefeed.app",
1010
1010
+
category: "Feeds",
1011
1011
+
subcategory: "Feed Tools",
1012
1012
+
description: "Discover feeds",
1013
1013
+
domain: "bluefeed.app",
1014
1014
+
quality: 4,
1015
1015
+
featured: false
1016
1016
+
},
1017
1017
+
{
194
1018
name: "Quiet Posters",
195
1019
url: "https://bsky.app/profile/did:plc:vpkhqolt662uhesyj6nxm7ys/feed/infreq",
196
1020
category: "Feeds",
197
1021
subcategory: "Discovery",
198
1022
description: "Feed of less frequent posters",
1023
1023
+
domain: "bsky.app",
1024
1024
+
quality: 3,
1025
1025
+
featured: false
1026
1026
+
},
1027
1027
+
{
1028
1028
+
name: "Popular with Friends",
1029
1029
+
url: "https://bsky.app/profile/bsky.app/feed/with-friends",
1030
1030
+
category: "Feeds",
1031
1031
+
subcategory: "Discovery",
1032
1032
+
description: "Posts popular with your friends",
1033
1033
+
domain: "bsky.app",
1034
1034
+
quality: 4,
1035
1035
+
featured: false
1036
1036
+
},
1037
1037
+
{
1038
1038
+
name: "Best of Friends",
1039
1039
+
url: "https://bsky.app/profile/bsky.app/feed/best-of-follows",
1040
1040
+
category: "Feeds",
1041
1041
+
subcategory: "Discovery",
1042
1042
+
description: "Best posts from who you follow",
1043
1043
+
domain: "bsky.app",
1044
1044
+
quality: 4,
1045
1045
+
featured: false
1046
1046
+
},
1047
1047
+
{
1048
1048
+
name: "Trending Links",
1049
1049
+
url: "https://bsky.app/profile/why.bsky.team/feed/links",
1050
1050
+
category: "Feeds",
1051
1051
+
subcategory: "Discovery",
1052
1052
+
description: "Popular links being shared",
1053
1053
+
domain: "bsky.app",
1054
1054
+
quality: 4,
1055
1055
+
featured: false
1056
1056
+
},
1057
1057
+
{
1058
1058
+
name: "Only Posts",
1059
1059
+
url: "https://bsky.app/profile/did:plc:tenurhgjptubkk5zf5qhi3og/feed/only-posts",
1060
1060
+
category: "Feeds",
1061
1061
+
subcategory: "Discovery",
1062
1062
+
description: "No reposts or replies",
1063
1063
+
domain: "bsky.app",
1064
1064
+
quality: 3,
1065
1065
+
featured: false
1066
1066
+
},
1067
1067
+
{
1068
1068
+
name: "Mentions Only",
1069
1069
+
url: "https://bsky.app/profile/flicknow.xyz/feed/mentions",
1070
1070
+
category: "Feeds",
1071
1071
+
subcategory: "Discovery",
1072
1072
+
description: "See only mentions",
1073
1073
+
domain: "bsky.app",
1074
1074
+
quality: 3,
1075
1075
+
featured: false
1076
1076
+
},
1077
1077
+
{
1078
1078
+
name: "My Misses",
1079
1079
+
url: "https://bsky.app/profile/goeo.lol/feed/misses",
1080
1080
+
category: "Feeds",
1081
1081
+
subcategory: "Discovery",
1082
1082
+
description: "See your unliked posts",
1083
1083
+
domain: "bsky.app",
1084
1084
+
quality: 3,
1085
1085
+
featured: false
1086
1086
+
},
1087
1087
+
{
1088
1088
+
name: "My Bangers",
1089
1089
+
url: "https://bsky.app/profile/jaz.bsky.social/feed/bangers",
1090
1090
+
category: "Feeds",
1091
1091
+
subcategory: "Discovery",
1092
1092
+
description: "See your most liked posts",
1093
1093
+
domain: "bsky.app",
199
1094
quality: 3,
200
1095
featured: false
201
1096
},
···
207
1102
category: "Visualizations",
208
1103
subcategory: "Firehose",
209
1104
description: "Live visualization of the firehose",
1105
1105
+
domain: "flikq.dev",
210
1106
quality: 3,
211
1107
featured: false
212
1108
},
···
216
1112
category: "Visualizations",
217
1113
subcategory: "Firehose",
218
1114
description: "Glimpses of deleted posts",
1115
1115
+
domain: "bad-example.com",
219
1116
quality: 3,
220
1117
featured: true
221
1118
},
1119
1119
+
{
1120
1120
+
name: "Swearsky",
1121
1121
+
url: "http://swearsky.bagpuss.org",
1122
1122
+
category: "Visualizations",
1123
1123
+
subcategory: "Firehose",
1124
1124
+
description: "Visualize swearing on Bluesky",
1125
1125
+
domain: "bagpuss.org",
1126
1126
+
quality: 3,
1127
1127
+
featured: false
1128
1128
+
},
1129
1129
+
{
1130
1130
+
name: "3D Firehose",
1131
1131
+
url: "https://firehose3d.theo.io",
1132
1132
+
category: "Visualizations",
1133
1133
+
subcategory: "Firehose",
1134
1134
+
description: "3D visualization of Bluesky posts",
1135
1135
+
domain: "theo.io",
1136
1136
+
quality: 3,
1137
1137
+
featured: false
1138
1138
+
},
1139
1139
+
{
1140
1140
+
name: "Firesky",
1141
1141
+
url: "https://firesky.tv",
1142
1142
+
category: "Visualizations",
1143
1143
+
subcategory: "Firehose",
1144
1144
+
description: "Visualize the Bluesky firehose",
1145
1145
+
domain: "firesky.tv",
1146
1146
+
quality: 3,
1147
1147
+
featured: false
1148
1148
+
},
1149
1149
+
{
1150
1150
+
name: "ATProto Firehose Event Counter",
1151
1151
+
url: "https://atproto.netlify.app",
1152
1152
+
category: "Visualizations",
1153
1153
+
subcategory: "Firehose",
1154
1154
+
description: "Count events in the firehose",
1155
1155
+
domain: "netlify.app",
1156
1156
+
quality: 3,
1157
1157
+
featured: false
1158
1158
+
},
1159
1159
+
{
1160
1160
+
name: "Matrix Style Visualization",
1161
1161
+
url: "https://simone.computer/bluerain/",
1162
1162
+
category: "Visualizations",
1163
1163
+
subcategory: "Firehose",
1164
1164
+
description: "Matrix-inspired visualization",
1165
1165
+
domain: "simone.computer",
1166
1166
+
quality: 3,
1167
1167
+
featured: false
1168
1168
+
},
1169
1169
+
{
1170
1170
+
name: "Spaceship Firehose Game",
1171
1171
+
url: "https://spaceshipfirehose.vercel.app/",
1172
1172
+
category: "Visualizations",
1173
1173
+
subcategory: "Firehose",
1174
1174
+
description: "Game powered by Bluesky firehose",
1175
1175
+
domain: "vercel.app",
1176
1176
+
quality: 3,
1177
1177
+
featured: false
1178
1178
+
},
1179
1179
+
{
1180
1180
+
name: "Live Word Cloud",
1181
1181
+
url: "https://flo-bit.dev/bluesky-visualizers/wordcloud",
1182
1182
+
category: "Visualizations",
1183
1183
+
subcategory: "Firehose",
1184
1184
+
description: "Real-time word cloud of posts",
1185
1185
+
domain: "flo-bit.dev",
1186
1186
+
quality: 3,
1187
1187
+
featured: false
1188
1188
+
},
1189
1189
+
{
1190
1190
+
name: "Trending Hashtags",
1191
1191
+
url: "https://flo-bit.dev/bluesky-trending/",
1192
1192
+
category: "Visualizations",
1193
1193
+
subcategory: "Firehose",
1194
1194
+
description: "See trending hashtags",
1195
1195
+
domain: "flo-bit.dev",
1196
1196
+
quality: 3,
1197
1197
+
featured: false
1198
1198
+
},
1199
1199
+
{
1200
1200
+
name: "Emotions Analysis",
1201
1201
+
url: "https://flo-bit.dev/bluesky-visualizers/emotions",
1202
1202
+
category: "Visualizations",
1203
1203
+
subcategory: "Firehose",
1204
1204
+
description: "Analyze emotions in posts",
1205
1205
+
domain: "flo-bit.dev",
1206
1206
+
quality: 3,
1207
1207
+
featured: false
1208
1208
+
},
1209
1209
+
{
1210
1210
+
name: "Imagehose",
1211
1211
+
url: "https://imagehose.net/",
1212
1212
+
category: "Visualizations",
1213
1213
+
subcategory: "Firehose",
1214
1214
+
description: "Stream of images from Bluesky",
1215
1215
+
domain: "imagehose.net",
1216
1216
+
quality: 3,
1217
1217
+
featured: false
1218
1218
+
},
1219
1219
+
{
1220
1220
+
name: "Colors of Bluesky",
1221
1221
+
url: "https://www.bewitched.com/demo/rainbowsky/",
1222
1222
+
category: "Visualizations",
1223
1223
+
subcategory: "Firehose",
1224
1224
+
description: "Color visualization of posts",
1225
1225
+
domain: "bewitched.com",
1226
1226
+
quality: 3,
1227
1227
+
featured: false
1228
1228
+
},
222
1229
223
1230
// Developer Tools
224
1231
{
···
227
1234
category: "Development",
228
1235
subcategory: "Tools",
229
1236
description: "Browse AtProto repositories",
1237
1237
+
domain: "pdsls.dev",
230
1238
quality: 5,
231
1239
featured: true
232
1240
},
···
236
1244
category: "Development",
237
1245
subcategory: "Tools",
238
1246
description: "Libraries & SDKs for the AT Protocol",
1247
1247
+
domain: "sdk.blue",
239
1248
quality: 4,
240
1249
featured: false
241
1250
},
1251
1251
+
{
1252
1252
+
name: "atp.tools",
1253
1253
+
url: "https://atp.tools/",
1254
1254
+
category: "Development",
1255
1255
+
subcategory: "Tools",
1256
1256
+
description: "Developer tools for AT Protocol",
1257
1257
+
domain: "atp.tools",
1258
1258
+
quality: 4,
1259
1259
+
featured: false
1260
1260
+
},
1261
1261
+
{
1262
1262
+
name: "Resolve a Bluesky Handle",
1263
1263
+
url: "https://internect.info",
1264
1264
+
category: "Development",
1265
1265
+
subcategory: "Tools",
1266
1266
+
description: "Handle resolution tool",
1267
1267
+
domain: "internect.info",
1268
1268
+
quality: 3,
1269
1269
+
featured: false
1270
1270
+
},
1271
1271
+
{
1272
1272
+
name: "Boat",
1273
1273
+
url: "https://boat.kelinci.net/",
1274
1274
+
category: "Development",
1275
1275
+
subcategory: "Tools",
1276
1276
+
description: "Various technical tools",
1277
1277
+
domain: "kelinci.net",
1278
1278
+
quality: 3,
1279
1279
+
featured: false
1280
1280
+
},
1281
1281
+
{
1282
1282
+
name: "blue.badge",
1283
1283
+
url: "https://badge.blue",
1284
1284
+
category: "Development",
1285
1285
+
subcategory: "Tools",
1286
1286
+
description: "Define, issue, and verify badges",
1287
1287
+
domain: "badge.blue",
1288
1288
+
quality: 3,
1289
1289
+
featured: false
1290
1290
+
},
1291
1291
+
{
1292
1292
+
name: "browser.blue",
1293
1293
+
url: "https://browser.blue/types",
1294
1294
+
category: "Development",
1295
1295
+
subcategory: "Tools",
1296
1296
+
description: "Browse AT Protocol types",
1297
1297
+
domain: "browser.blue",
1298
1298
+
quality: 3,
1299
1299
+
featured: false
1300
1300
+
},
1301
1301
+
{
1302
1302
+
name: "SkyTools",
1303
1303
+
url: "https://skytools.anon5r.com/profile",
1304
1304
+
category: "Development",
1305
1305
+
subcategory: "Tools",
1306
1306
+
description: "Various developer tools",
1307
1307
+
domain: "anon5r.com",
1308
1308
+
quality: 3,
1309
1309
+
featured: false
1310
1310
+
},
1311
1311
+
{
1312
1312
+
name: "Lexicon Community",
1313
1313
+
url: "https://github.com/lexicon-community",
1314
1314
+
category: "Development",
1315
1315
+
subcategory: "Tools",
1316
1316
+
description: "Community-made lexicons",
1317
1317
+
domain: "github.com",
1318
1318
+
quality: 3,
1319
1319
+
featured: false
1320
1320
+
},
1321
1321
+
{
1322
1322
+
name: "atproto-did-web",
1323
1323
+
url: "https://atproto-did-web.lukeacl.com/",
1324
1324
+
category: "Development",
1325
1325
+
subcategory: "Tools",
1326
1326
+
description: "DID web tools for AT Protocol",
1327
1327
+
domain: "lukeacl.com",
1328
1328
+
quality: 3,
1329
1329
+
featured: false
1330
1330
+
},
1331
1331
+
{
1332
1332
+
name: "Manual",
1333
1333
+
url: "https://manual.renahlee.com/",
1334
1334
+
category: "Development",
1335
1335
+
subcategory: "Tools",
1336
1336
+
description: "Set a non-default PLC key",
1337
1337
+
domain: "renahlee.com",
1338
1338
+
quality: 3,
1339
1339
+
featured: false
1340
1340
+
},
1341
1341
+
{
1342
1342
+
name: "Skeetbeaver",
1343
1343
+
url: "https://skeetbeaver.pages.dev/",
1344
1344
+
category: "Development",
1345
1345
+
subcategory: "Tools",
1346
1346
+
description: "Assorted tools for retrieving data",
1347
1347
+
domain: "pages.dev",
1348
1348
+
quality: 3,
1349
1349
+
featured: false
1350
1350
+
},
1351
1351
+
{
1352
1352
+
name: "Bsky Debug Page",
1353
1353
+
url: "https://bsky-debug.app/handle",
1354
1354
+
category: "Development",
1355
1355
+
subcategory: "Tools",
1356
1356
+
description: "Debug Bluesky handles and profiles",
1357
1357
+
domain: "bsky-debug.app",
1358
1358
+
quality: 3,
1359
1359
+
featured: false
1360
1360
+
},
1361
1361
+
{
1362
1362
+
name: "Skyware",
1363
1363
+
url: "https://skyware.js.org",
1364
1364
+
category: "Development",
1365
1365
+
subcategory: "Tools",
1366
1366
+
description: "Package collection for developers",
1367
1367
+
domain: "js.org",
1368
1368
+
quality: 3,
1369
1369
+
featured: false
1370
1370
+
},
1371
1371
+
{
1372
1372
+
name: "Atcute",
1373
1373
+
url: "https://github.com/mary-ext/atcute",
1374
1374
+
category: "Development",
1375
1375
+
subcategory: "Tools",
1376
1376
+
description: "Lightweight TypeScript packages for AT Protocol",
1377
1377
+
domain: "github.com",
1378
1378
+
quality: 4,
1379
1379
+
featured: false
1380
1380
+
},
1381
1381
+
{
1382
1382
+
name: "bluesky-embed",
1383
1383
+
url: "https://github.com/mary-ext/bluesky-embed",
1384
1384
+
category: "Development",
1385
1385
+
subcategory: "Tools",
1386
1386
+
description: "Custom element for embedding Bluesky posts",
1387
1387
+
domain: "github.com",
1388
1388
+
quality: 4,
1389
1389
+
featured: false
1390
1390
+
},
1391
1391
+
{
1392
1392
+
name: "Clearsky API",
1393
1393
+
url: "https://github.com/ClearskyApp06/clearskyservices/blob/main/api.md",
1394
1394
+
category: "Development",
1395
1395
+
subcategory: "Tools",
1396
1396
+
description: "API for ClearSky services",
1397
1397
+
domain: "github.com",
1398
1398
+
quality: 3,
1399
1399
+
featured: false
1400
1400
+
},
1401
1401
+
{
1402
1402
+
name: "Hopper",
1403
1403
+
url: "https://hopper.at/",
1404
1404
+
category: "Development",
1405
1405
+
subcategory: "Tools",
1406
1406
+
description: "AT-URI redirection tool",
1407
1407
+
domain: "hopper.at",
1408
1408
+
quality: 3,
1409
1409
+
featured: false
1410
1410
+
},
1411
1411
+
{
1412
1412
+
name: "atproto-scraping",
1413
1413
+
url: "https://github.com/mary-ext/atproto-scraping",
1414
1414
+
category: "Development",
1415
1415
+
subcategory: "Tools",
1416
1416
+
description: "Scraping tools for AT Protocol",
1417
1417
+
domain: "github.com",
1418
1418
+
quality: 3,
1419
1419
+
featured: false
1420
1420
+
},
1421
1421
+
{
1422
1422
+
name: "TID converter",
1423
1423
+
url: "https://mary.my.id/tools/tid-converter",
1424
1424
+
category: "Development",
1425
1425
+
subcategory: "Tools",
1426
1426
+
description: "Convert between TIDs and dates",
1427
1427
+
domain: "mary.my.id",
1428
1428
+
quality: 3,
1429
1429
+
featured: false
1430
1430
+
},
1431
1431
+
{
1432
1432
+
name: "Weather Vane",
1433
1433
+
url: "https://verify.aviary.domains/",
1434
1434
+
category: "Development",
1435
1435
+
subcategory: "Tools",
1436
1436
+
description: "Domain verification tool",
1437
1437
+
domain: "aviary.domains",
1438
1438
+
quality: 3,
1439
1439
+
featured: false
1440
1440
+
},
1441
1441
+
{
1442
1442
+
name: "TID clock",
1443
1443
+
url: "https://retr0.id/stuff/atclock/",
1444
1444
+
category: "Development",
1445
1445
+
subcategory: "Tools",
1446
1446
+
description: "Visual TID clock",
1447
1447
+
domain: "retr0.id",
1448
1448
+
quality: 3,
1449
1449
+
featured: false
1450
1450
+
},
1451
1451
+
{
1452
1452
+
name: "handles.net",
1453
1453
+
url: "https://handles.net/",
1454
1454
+
category: "Development",
1455
1455
+
subcategory: "Tools",
1456
1456
+
description: "Manage Bluesky handles for your community",
1457
1457
+
domain: "handles.net",
1458
1458
+
quality: 4,
1459
1459
+
featured: false
1460
1460
+
},
1461
1461
+
{
1462
1462
+
name: "Lexidex",
1463
1463
+
url: "https://lexidex.bsky.dev/",
1464
1464
+
category: "Development",
1465
1465
+
subcategory: "Tools",
1466
1466
+
description: "Catalog of lexicons",
1467
1467
+
domain: "bsky.dev",
1468
1468
+
quality: 3,
1469
1469
+
featured: false
1470
1470
+
},
242
1471
243
1472
// Guides & Documentation
244
1473
{
···
247
1476
category: "Guides",
248
1477
subcategory: "Documentation",
249
1478
description: "How to verify your Bluesky account",
1479
1479
+
domain: "bsky.social",
250
1480
quality: 4,
251
1481
featured: false
252
1482
},
···
256
1486
category: "Guides",
257
1487
subcategory: "Documentation",
258
1488
description: "Comprehensive Bluesky guide",
1489
1489
+
domain: "mackuba.eu",
259
1490
quality: 5,
260
1491
featured: false
261
1492
},
1493
1493
+
{
1494
1494
+
name: "Advanced Search Guide",
1495
1495
+
url: "https://bsky.social/about/blog/05-31-2024-search",
1496
1496
+
category: "Guides",
1497
1497
+
subcategory: "Documentation",
1498
1498
+
description: "Guide to using advanced search",
1499
1499
+
domain: "bsky.social",
1500
1500
+
quality: 4,
1501
1501
+
featured: false
1502
1502
+
},
1503
1503
+
{
1504
1504
+
name: "Run your own PDS Server",
1505
1505
+
url: "https://www.youtube.com/watch?v=7-VJvf39xVE&t=4s",
1506
1506
+
category: "Guides",
1507
1507
+
subcategory: "Documentation",
1508
1508
+
description: "How to run your own Bluesky PDS Server",
1509
1509
+
domain: "youtube.com",
1510
1510
+
quality: 4,
1511
1511
+
featured: false
1512
1512
+
},
262
1513
263
1514
// Miscellaneous
264
1515
{
···
267
1518
category: "Misc",
268
1519
subcategory: "Tools",
269
1520
description: "Create and organize threads",
1521
1521
+
domain: "pages.dev",
270
1522
quality: 3,
271
1523
featured: false
272
1524
},
···
276
1528
category: "Misc",
277
1529
subcategory: "Tools",
278
1530
description: "Share threads with people without an account",
1531
1531
+
domain: "skyview.social",
279
1532
quality: 4,
280
1533
featured: false
281
1534
},
···
285
1538
category: "Misc",
286
1539
subcategory: "Tools",
287
1540
description: "Video downloader",
1541
1541
+
domain: "down.blue",
1542
1542
+
quality: 3,
1543
1543
+
featured: false
1544
1544
+
},
1545
1545
+
{
1546
1546
+
name: "iOS Shortcuts Collection",
1547
1547
+
url: "https://matthewcassinelli.com/shortcuts/folders/bluesky/",
1548
1548
+
category: "Misc",
1549
1549
+
subcategory: "Tools",
1550
1550
+
description: "Useful iOS shortcuts for Bluesky",
1551
1551
+
domain: "matthewcassinelli.com",
1552
1552
+
quality: 3,
1553
1553
+
featured: false
1554
1554
+
},
1555
1555
+
{
1556
1556
+
name: "Bookmarks/Drafts Workaround",
1557
1557
+
url: "https://bsky.app/profile/dame.bsky.social/post/3lb5wrehvdc2g",
1558
1558
+
category: "Misc",
1559
1559
+
subcategory: "Tools",
1560
1560
+
description: "Workaround for saving bookmarks/drafts",
1561
1561
+
domain: "bsky.app",
1562
1562
+
quality: 3,
1563
1563
+
featured: false
1564
1564
+
},
1565
1565
+
{
1566
1566
+
name: "cobalt.tools",
1567
1567
+
url: "https://cobalt.tools",
1568
1568
+
category: "Misc",
1569
1569
+
subcategory: "Tools",
1570
1570
+
description: "Media saver",
1571
1571
+
domain: "cobalt.tools",
1572
1572
+
quality: 3,
1573
1573
+
featured: false
1574
1574
+
},
1575
1575
+
{
1576
1576
+
name: "Social Profile Widget Generator",
1577
1577
+
url: "https://bsky-widget.srbh.dev",
1578
1578
+
category: "Misc",
1579
1579
+
subcategory: "Tools",
1580
1580
+
description: "Generate profile widgets",
1581
1581
+
domain: "srbh.dev",
1582
1582
+
quality: 3,
1583
1583
+
featured: false
1584
1584
+
},
1585
1585
+
{
1586
1586
+
name: "Bluesky Lore",
1587
1587
+
url: "https://bsky.app/profile/jay.bsky.team/post/3lbd2eaura22r",
1588
1588
+
category: "Misc",
1589
1589
+
subcategory: "Tools",
1590
1590
+
description: "Bluesky lore, as told by Jay",
1591
1591
+
domain: "bsky.app",
1592
1592
+
quality: 3,
1593
1593
+
featured: false
1594
1594
+
},
1595
1595
+
{
1596
1596
+
name: "The Fediverse Report",
1597
1597
+
url: "https://fediversereport.com",
1598
1598
+
category: "Misc",
1599
1599
+
subcategory: "Tools",
1600
1600
+
description: "Bluesky and ATmosphere newsletter",
1601
1601
+
domain: "fediversereport.com",
288
1602
quality: 3,
289
1603
featured: false
290
1604
}
···
318
1632
// Filter by search query
319
1633
const searchMatch =
320
1634
resource.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
321
321
-
resource.description.toLowerCase().includes(searchQuery.toLowerCase());
1635
1635
+
resource.description.toLowerCase().includes(searchQuery.toLowerCase()) ||
1636
1636
+
(resource.domain && resource.domain.toLowerCase().includes(searchQuery.toLowerCase()));
322
1637
323
1638
// Filter by quality
324
1639
const qualityMatch =
···
336
1651
return resourcesWithUTM.filter(resource => resource.featured);
337
1652
}, [resourcesWithUTM]);
338
1653
1654
1654
+
// Should show featured section only when All category is selected
1655
1655
+
const shouldShowFeatured = activeCategory === 'All';
1656
1656
+
339
1657
// Simulate loading data
340
1658
useEffect(() => {
341
1659
// Simulate API fetch with a timeout
···
391
1709
</div>
392
1710
393
1711
<div className="filter-options">
394
394
-
<div className="category-filters">
395
395
-
{categories.map(category => (
396
396
-
<button
397
397
-
key={category}
398
398
-
className={`category-filter ${activeCategory === category ? 'active' : ''}`}
399
399
-
onClick={() => setActiveCategory(category)}
400
400
-
>
401
401
-
{category}
402
402
-
</button>
403
403
-
))}
1712
1712
+
<div className="category-filters-container">
1713
1713
+
<div className="category-filters">
1714
1714
+
{categories.map(category => (
1715
1715
+
<button
1716
1716
+
key={category}
1717
1717
+
className={`category-filter ${activeCategory === category ? 'active' : ''}`}
1718
1718
+
onClick={() => setActiveCategory(category)}
1719
1719
+
>
1720
1720
+
{categoryEmojis[category]} {category}
1721
1721
+
</button>
1722
1722
+
))}
1723
1723
+
</div>
404
1724
</div>
405
1725
406
1726
<div className="quality-filter">
···
418
1738
</div>
419
1739
</div>
420
1740
421
421
-
{featuredResources.length > 0 && (
1741
1741
+
{shouldShowFeatured && featuredResources.length > 0 && (
422
1742
<div className="featured-section">
423
1743
<h2>Featured Resources</h2>
1744
1744
+
<p className="featured-description">Hand-selected tools that we love and use regularly. These are not sponsored or paid placements.</p>
424
1745
<div className="resources-grid">
425
1746
{featuredResources.map((resource, index) => (
426
1747
<ResourceCard key={`featured-${index}`} resource={resource} />
···
430
1751
)}
431
1752
432
1753
<div className="all-resources-section">
433
433
-
<h2>{activeCategory === 'All' ? 'All Resources' : activeCategory}</h2>
1754
1754
+
<h2>{activeCategory === 'All' ? 'All Resources' : `${categoryEmojis[activeCategory]} ${activeCategory} Resources`}</h2>
434
1755
{filteredResources.length > 0 ? (
435
1756
<div className="resources-grid">
436
1757
{filteredResources.map((resource, index) => (
···
479
1800
<div className="resource-content">
480
1801
<h3 className="resource-name">{resource.name}</h3>
481
1802
<p className="resource-description">{resource.description}</p>
1803
1803
+
<p className="resource-domain">{resource.domain}</p>
482
1804
<div className="resource-meta">
483
1805
<span className="resource-category">{resource.category}</span>
484
1806
<div className="resource-quality">