Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
mastodon
GitHub Repository: mastodon/joinmastodon
Path: blob/main/data/apps.ts
1006 views
1
import tusky from "../public/apps/tusky.png"
2
import subwayTooter from "../public/apps/subway-tooter.png"
3
import fedilab from "../public/apps/fedilab.png"
4
import mast from "../public/apps/mast.png"
5
import mastonaut from "../public/apps/mastonaut.png"
6
import tokodon from "../public/apps/tokodon.png"
7
import toot from "../public/apps/toot.jpg"
8
import pinafore from "../public/apps/pinafore.png"
9
import whalebird from "../public/apps/whalebird.png"
10
import thedesk from "../public/apps/thedesk.png"
11
import imast from "../public/apps/imast_icon.png"
12
import sengi from "../public/apps/sengi.png"
13
import sora from "../public/apps/sora.png"
14
import bitlbee from "../public/apps/bitlbee.png"
15
import icecubes from "../public/apps/icecubes.png"
16
import elk from "../public/apps/elk.png"
17
import buffer from "../public/apps/buffer.png"
18
import ivory from "../public/apps/ivory.png"
19
import statuzer from "../public/apps/statuzer.png"
20
import woolly from "../public/apps/woolly.png"
21
import tuba from "../public/apps/tuba.png"
22
import dawn from "../public/apps/dawn.png"
23
import mona from "../public/apps/mona.png"
24
import fedica from "../public/apps/fedica.png"
25
import feather from "../public/apps/feather.png"
26
import focus from "../public/apps/focus.png"
27
import radiant from "../public/apps/radiant.png"
28
import phanpy from "../public/apps/phanpy.png"
29
import tootrain from "../public/apps/tootrain.png"
30
import trunks from "../public/apps/trunks.png"
31
import tootdesk from "../public/apps/tootdesk.png"
32
import tooty from "../public/apps/tooty.png"
33
import moshidon from "../public/apps/moshidon.png"
34
import litterbox from "../public/apps/litterbox.png"
35
import lmst from "../public/apps/lmst.png"
36
import zonepane from "../public/apps/zonepane.png"
37
import fedistar from "../public/apps/fedistar.png"
38
import amidon from "../public/apps/amidon.png"
39
import brexxtodon from "../public/apps/brexxtodon.png"
40
import dostodon from "../public/apps/dostodon.png"
41
import macstodon from "../public/apps/macstodon.png"
42
import mastodonforappleii from "../public/apps/mastodonforappleii.png"
43
import mastodonforworkgroups from "../public/apps/mastodonforworkgroups.png"
44
import mastonine from "../public/apps/mastonine.png"
45
import mastodeck from "../public/apps/mastodeck.png"
46
import stomp from "../public/apps/stomp.png"
47
import pachli from "../public/apps/pachli.png"
48
import pipilo from "../public/apps/pipilo.png"
49
import rodent from "../public/apps/rodent.png"
50
import heffalump from "../public/apps/heffalump.png"
51
import mostodon from "../public/apps/mostodon.png"
52
import brutaldon from "../public/apps/brutaldon.png"
53
import oxpecker from "../public/apps/oxpecker.png"
54
import bubble from "../public/apps/bubble.png"
55
import odous from "../public/apps/odous.png"
56
import dowstodon from "../public/apps/dowstodon.png"
57
import fread from "../public/apps/fread.png"
58
import nicolium from "../public/apps/nicolium.png"
59
import fursona from "../public/apps/fursona.png"
60
import mastui from "../public/apps/mastui.png"
61
62
import { z } from "zod"
63
import type { StaticImageData } from "next/legacy/image"
64
65
export type appsList = {
66
/** the operating system or platform the list of apps is built for */
67
[platform: string]: {
68
/** the name of the app */
69
name: string
70
/** app's icon or logo */
71
icon: StaticImageData
72
/** link to the app on its website or respective app store */
73
url: string
74
/** the date the app was first released on */
75
released_on?: string
76
/** whether the app requires a fee to access. defaults to false */
77
paid?: boolean
78
/** whether the app should be hidden from all, used to avoid duplicates */
79
hidden_from_all?: boolean
80
/** The category label */
81
categoryLabel?: string
82
/** Whether the application is considered open, defaults to false */
83
open?: boolean
84
/** The link to the application's source code if known */
85
source_url?: string
86
}[]
87
}
88
89
// Zod schema for runtime validation
90
const appSchema = z
91
.object({
92
name: z.string().min(1, "App name is required"),
93
icon: z.any(),
94
url: z.string().url("App URL must be a valid URL"),
95
released_on: z.string().optional(),
96
paid: z.boolean().optional(),
97
hidden_from_all: z.boolean().optional(),
98
categoryLabel: z.string().optional(),
99
open: z.boolean().optional(),
100
source_url: z.string().url("Source URL must be a valid URL").optional(),
101
})
102
.refine(
103
(data) => {
104
// If open source, source_url must be provided
105
if (data.open === true && !data.source_url) {
106
return false
107
}
108
return true
109
},
110
{
111
message: "Open source apps (open: true) must have a source_url",
112
}
113
)
114
115
const appsListSchema = z.record(z.string(), z.array(appSchema))
116
117
/**
118
* Validates the apps data structure at runtime.
119
* Throws an error if validation fails.
120
*/
121
function validateApps(appsData: appsList): void {
122
try {
123
appsListSchema.parse(appsData)
124
} catch (error) {
125
if (error instanceof z.ZodError) {
126
const errors = error.errors.map(
127
(err) =>
128
`${err.path.join(".")}: ${err.message} ${err.code === "custom" ? `(${JSON.stringify(err.params)})` : ""}`
129
)
130
throw new Error(`Apps validation failed:\n${errors.join("\n")}`)
131
}
132
throw error
133
}
134
}
135
export const apps: appsList = {
136
android: [
137
{
138
released_on: "Nov 23, 2023",
139
name: "Rodent",
140
icon: rodent,
141
url: "https://play.google.com/store/apps/details?id=social.rodent",
142
paid: false,
143
open: false,
144
},
145
{
146
released_on: "May 21, 2023",
147
name: "Focus",
148
icon: focus,
149
url: "https://play.google.com/store/apps/details?id=allen.town.focus.mastodon",
150
paid: false,
151
open: true,
152
source_url: "https://github.com/allentown521/FocusMastodon",
153
},
154
{
155
released_on: "Mar 15, 2017",
156
name: "Tusky",
157
icon: tusky,
158
url: "https://play.google.com/store/apps/details?id=com.keylesspalace.tusky",
159
open: true,
160
source_url: "https://github.com/tuskyapp/Tusky",
161
},
162
{
163
released_on: "Apr 23, 2017",
164
name: "Subway Tooter",
165
icon: subwayTooter,
166
url: "https://play.google.com/store/apps/details?id=jp.juggler.subwaytooter",
167
open: true,
168
source_url: "https://github.com/tateisu/SubwayTooter",
169
},
170
{
171
released_on: "May 18, 2019",
172
name: "Fedilab",
173
icon: fedilab,
174
url: "https://play.google.com/store/apps/details?id=app.fedilab.android",
175
paid: false,
176
open: true,
177
source_url: "https://codeberg.org/tom79/Fedilab",
178
},
179
{
180
released_on: "Jan 26, 2023",
181
name: "Trunks",
182
icon: trunks,
183
url: "https://play.google.com/store/apps/details?id=com.decad3nce.trunks",
184
paid: false,
185
hidden_from_all: true,
186
},
187
{
188
released_on: "Dec 6, 2022",
189
name: "Moshidon",
190
icon: moshidon,
191
url: "https://play.google.com/store/apps/details?id=org.joinmastodon.android.moshinda",
192
paid: false,
193
open: true,
194
source_url: "https://github.com/LucasGGamerM/moshidon",
195
},
196
{
197
released_on: "Jan 31, 2023",
198
name: "Buffer",
199
icon: buffer,
200
url: "https://play.google.com/store/apps/details?id=org.buffer.android",
201
hidden_from_all: true,
202
},
203
{
204
released_on: "Feb 21, 2023",
205
name: "ZonePane",
206
icon: zonepane,
207
url: "https://play.google.com/store/apps/details?id=com.zonepane",
208
paid: false,
209
open: false,
210
},
211
{
212
released_on: "Sep 6, 2023",
213
name: "Pachli",
214
icon: pachli,
215
url: "https://play.google.com/store/apps/details?id=app.pachli",
216
paid: false,
217
open: true,
218
source_url: "https://github.com/pachli/pachli-android",
219
},
220
{
221
released_on: "Aug 1, 2024",
222
name: "Fread",
223
icon: fread,
224
url: "https://play.google.com/store/apps/details?id=com.zhangke.fread",
225
paid: false,
226
open: false,
227
},
228
],
229
ios: [
230
{
231
name: "Toot!",
232
icon: toot,
233
url: "https://apps.apple.com/app/toot/id1229021451",
234
paid: true,
235
open: false,
236
},
237
{
238
name: "Mast",
239
icon: mast,
240
url: "https://apps.apple.com/app/mast-for-mastodon/id1437429129",
241
paid: true,
242
open: false,
243
},
244
{
245
name: "iMast",
246
icon: imast,
247
url: "https://apps.apple.com/app/imast/id1229461703",
248
open: true,
249
source_url: "https://github.com/cinderella-project/iMast",
250
},
251
{
252
released_on: "Jan 19, 2023",
253
name: "Ice Cubes",
254
icon: icecubes,
255
url: "https://apps.apple.com/app/ice-cubes-for-mastodon/id6444915884",
256
open: true,
257
source_url: "https://github.com/Dimillian/IceCubesApp",
258
},
259
{
260
released_on: "Jan 31, 2023",
261
name: "Buffer",
262
icon: buffer,
263
url: "https://apps.apple.com/app/buffer-plan-schedule-posts/id490474324",
264
hidden_from_all: true,
265
},
266
{
267
released_on: "Jan 24, 2023",
268
name: "Ivory",
269
icon: ivory,
270
url: "https://apps.apple.com/app/ivory-for-mastodon-by-tapbots/id6444602274",
271
paid: true,
272
open: false,
273
},
274
{
275
released_on: "Mar 24, 2023",
276
name: "Woolly",
277
icon: woolly,
278
url: "https://apps.apple.com/app/woolly-for-mastodon/id6444360628",
279
paid: true,
280
open: false,
281
},
282
{
283
released_on: "Mar 27, 2023",
284
name: "DAWN for Mastodon",
285
icon: dawn,
286
url: "https://apps.apple.com/app/nightfox-dawn/id1668645019",
287
paid: false,
288
open: false,
289
},
290
{
291
released_on: "May 1, 2023",
292
name: "Mona",
293
icon: mona,
294
url: "https://apps.apple.com/app/id1659154653",
295
paid: true,
296
open: false,
297
},
298
{
299
released_on: "Jun 19, 2023",
300
name: "Radiant",
301
icon: radiant,
302
url: "https://apps.apple.com/app/id6444323022",
303
paid: true,
304
open: false,
305
},
306
{
307
released_on: "Jan 26, 2023",
308
name: "Trunks",
309
icon: trunks,
310
url: "https://apps.apple.com/app/trunks-for-mastodon/id6444749479",
311
paid: false,
312
hidden_from_all: true,
313
},
314
{
315
released_on: "Jan 25, 2023",
316
name: "TootDesk",
317
icon: tootdesk,
318
url: "https://apps.apple.com/app/tootdesk/id1591748028",
319
paid: false,
320
open: true,
321
source_url: "https://github.com/cutls/TootDesk",
322
},
323
{
324
released_on: "Aug 4, 2023",
325
name: "Stomp (watchOS)",
326
icon: stomp,
327
url: "https://apps.apple.com/app/stomp-for-mastodon/id1670866247",
328
paid: true,
329
open: false,
330
},
331
{
332
released_on: "Jun 22, 2023",
333
name: "feather",
334
icon: feather,
335
url: "https://apps.apple.com/app/feather-for-mastodon/id6446263061",
336
paid: false,
337
open: false,
338
},
339
{
340
released_on: "Aug 10, 2023",
341
name: "SoraSNS",
342
icon: sora,
343
url: "https://apps.apple.com/app/sorasns-for-mastodon-bluesky/id6754866904",
344
paid: false,
345
open: false,
346
},
347
{
348
released_on: "Nov 7, 2023",
349
name: "Pipilo",
350
icon: pipilo,
351
url: "https://apps.apple.com/app/pipilo/id1584544719",
352
paid: true,
353
open: false,
354
},
355
{
356
released_on: "Jun 3, 2024",
357
name: "Oxpecker (watchOS)",
358
icon: oxpecker,
359
url: "https://apps.apple.com/app/oxpecker-for-mastodon/id6474893905",
360
paid: true,
361
open: false,
362
},
363
{
364
released_on: "Jul 10, 2024",
365
name: "Bubble",
366
icon: bubble,
367
url: "https://apps.apple.com/app/bubble/id6477757490",
368
paid: false,
369
open: true,
370
source_url: "https://github.com/lumaa-dev/BubbleApp",
371
},
372
{
373
released_on: "Jan 1, 2024",
374
name: "Odous (watchOS)",
375
icon: odous,
376
url: "https://apps.apple.com/app/id6446084064",
377
paid: true,
378
open: false,
379
},
380
{
381
released_on: "Nov 27, 2025",
382
name: "Fursona (for Furry)",
383
icon: fursona,
384
url: "https://apps.apple.com/us/app/fursona-furry-social-app/id6754586637",
385
paid: false,
386
open: false,
387
},
388
],
389
web: [
390
{
391
name: "Pinafore",
392
icon: pinafore,
393
url: "https://pinafore.social",
394
open: true,
395
source_url: "https://github.com/nolanlawson/pinafore",
396
},
397
{
398
name: "Elk",
399
icon: elk,
400
url: "https://elk.zone",
401
open: true,
402
source_url: "https://github.com/elk-zone/elk",
403
},
404
{ name: "Buffer", icon: buffer, url: "https://buffer.com", open: false },
405
{
406
name: "Statuzer",
407
icon: statuzer,
408
url: "https://statuzer.com",
409
open: false,
410
},
411
{ name: "Fedica", icon: fedica, url: "https://fedica.com", open: false },
412
{
413
name: "Phanpy",
414
icon: phanpy,
415
url: "https://phanpy.social",
416
open: true,
417
source_url: "https://github.com/cheeaun/phanpy",
418
},
419
{
420
name: "Litterbox",
421
icon: litterbox,
422
url: "https://litterbox.koyu.space",
423
open: false,
424
},
425
{
426
name: "Lmst",
427
icon: lmst,
428
url: "https://lmst.online",
429
open: true,
430
source_url: "https://github.com/cyevgeniy/lmst",
431
},
432
{
433
name: "Tooty",
434
icon: tooty,
435
url: "https://n1k0.github.io/tooty/v2/",
436
open: true,
437
source_url: "https://github.com/n1k0/tooty",
438
},
439
{
440
name: "Mastodeck",
441
icon: mastodeck,
442
url: "https://mastodeck.com/",
443
open: false,
444
},
445
{
446
name: "Sengi",
447
icon: sengi,
448
url: "https://nicolasconstant.github.io/sengi/",
449
open: true,
450
source_url: "https://github.com/NicolasConstant/sengi",
451
},
452
{
453
name: "Nicolium",
454
icon: nicolium,
455
url: "https://web.nicolium.app/",
456
open: true,
457
source_url: "https://codeberg.org/mkljczk/nicolium",
458
},
459
],
460
desktop: [
461
{
462
name: "Tokodon",
463
icon: tokodon,
464
url: "https://apps.kde.org/tokodon/",
465
open: true,
466
source_url: "https://github.com/KDE/tokodon",
467
},
468
{
469
name: "Whalebird",
470
icon: whalebird,
471
url: "https://whalebird.social",
472
open: true,
473
source_url: "https://github.com/h3poteto/whalebird-desktop",
474
},
475
{
476
name: "TheDesk",
477
icon: thedesk,
478
url: "https://thedesk.top/en",
479
open: true,
480
source_url: "https://github.com/cutls/thedesk-next",
481
},
482
{
483
name: "Mast",
484
icon: mast,
485
url: "https://apps.apple.com/app/mast-for-mastodon/id1437429129",
486
paid: true,
487
hidden_from_all: true,
488
},
489
{
490
released_on: "Jan 19, 2023",
491
name: "Ice Cubes",
492
icon: icecubes,
493
url: "https://apps.apple.com/app/ice-cubes-for-mastodon/id6444915884",
494
hidden_from_all: true,
495
},
496
{
497
name: "Mastonaut",
498
icon: mastonaut,
499
url: "https://apps.apple.com/app/mastonaut/id1450757574",
500
open: true,
501
source_url: "https://github.com/chucker/Mastonaut",
502
},
503
{
504
name: "Sengi",
505
icon: sengi,
506
url: "https://nicolasconstant.github.io/sengi/",
507
hidden_from_all: true,
508
},
509
{
510
name: "Bitlbee-Mastodon",
511
icon: bitlbee,
512
url: "https://alexschroeder.ch/cgit/bitlbee-mastodon/about/",
513
open: true,
514
source_url: "https://src.alexschroeder.ch/bitlbee-mastodon.git/",
515
},
516
{
517
released_on: "Mar 23, 2023",
518
name: "Tuba",
519
icon: tuba,
520
url: "https://tuba.geopjr.dev/",
521
open: true,
522
source_url: "https://github.com/GeopJr/Tuba",
523
},
524
{
525
released_on: "May 1, 2023",
526
name: "Mona",
527
icon: mona,
528
url: "https://apps.apple.com/app/id1659154653",
529
paid: true,
530
hidden_from_all: true,
531
open: false,
532
},
533
{
534
released_on: "Aug 10, 2021",
535
name: "TootRain",
536
icon: tootrain,
537
url: "https://apps.apple.com/app/id1579538917",
538
open: true,
539
source_url: "https://github.com/b123400/TootRain",
540
},
541
{
542
released_on: "Mar 1, 2023",
543
name: "Fedistar",
544
icon: fedistar,
545
url: "https://fedistar.net",
546
paid: false,
547
open: true,
548
source_url: "https://github.com/h3poteto/fedistar",
549
},
550
{
551
released_on: "May 23, 2023",
552
name: "Ivory",
553
icon: ivory,
554
url: "https://apps.apple.com/app/ivory-for-mastodon-by-tapbots/id6444602274",
555
paid: true,
556
hidden_from_all: true,
557
},
558
{
559
released_on: "Aug 26, 2024",
560
name: "Dowstodon",
561
icon: dowstodon,
562
url: "https://www.microsoft.com/store/productId/9PHNV45JVR2S",
563
paid: false,
564
open: false,
565
},
566
{
567
released_on: "Aug 13, 2025",
568
name: "Mastui",
569
icon: mastui,
570
url: "https://mastui.app",
571
paid: false,
572
open: true,
573
source_url: "https://github.com/kimusan/mastui/",
574
},
575
],
576
retro: [
577
{
578
released_on: "Apr 1, 2023",
579
name: "Amidon",
580
icon: amidon,
581
url: "https://github.com/BlitterStudio/amidon",
582
open: true,
583
source_url: "https://github.com/BlitterStudio/amidon",
584
},
585
{
586
released_on: "Feb 5, 2023",
587
name: "BREXXTODON",
588
icon: brexxtodon,
589
url: "https://github.com/mainframed/BREXXTODON",
590
open: true,
591
source_url: "https://github.com/mainframed/BREXXTODON",
592
},
593
{
594
released_on: "Nov 14, 2022",
595
name: "DOStodon",
596
icon: dostodon,
597
url: "https://github.com/SuperIlu/DOStodon",
598
open: true,
599
source_url: "https://github.com/SuperIlu/DOStodon",
600
},
601
{
602
released_on: "Nov 20, 2022",
603
name: "Macstodon",
604
icon: macstodon,
605
url: "https://github.com/smallsco/macstodon",
606
open: true,
607
source_url: "https://github.com/smallsco/macstodon",
608
},
609
{
610
released_on: "Apr 14, 2023",
611
name: "Masto9",
612
icon: mastonine,
613
url: "https://sr.ht/~julienxx/Masto9/",
614
open: true,
615
source_url: "https://sr.ht/~julienxx/Masto9/",
616
},
617
{
618
released_on: "Mar 6, 2023",
619
name: "Mastodon for Apple II",
620
icon: mastodonforappleii,
621
url: "https://www.colino.net/wordpress/en/binary-release-of-mastodon-for-the-apple-c/",
622
open: true,
623
source_url: "https://github.com/colinleroy/a2tools/",
624
},
625
{
626
released_on: "Nov 20, 2022",
627
name: "Mastodon 3.11 for Workgroups",
628
icon: mastodonforworkgroups,
629
url: "https://github.com/meyskens/mastodon-for-workgroups",
630
open: true,
631
source_url: "https://github.com/meyskens/mastodon-for-workgroups",
632
},
633
{
634
released_on: "Sep 12, 2023",
635
name: "Heffalump",
636
icon: heffalump,
637
url: "https://github.com/knickish/heffalump",
638
open: true,
639
source_url: "https://github.com/knickish/heffalump",
640
},
641
{
642
released_on: "Sep 17, 2023",
643
name: "MOStodon",
644
icon: mostodon,
645
url: "https://github.com/Havoc6502/MOStodon",
646
paid: false,
647
open: true,
648
source_url: "https://github.com/Havoc6502/MOStodon",
649
},
650
{
651
released_on: "Jan 06, 2018",
652
name: "Brutaldon",
653
icon: brutaldon,
654
url: "https://brutaldon.org",
655
paid: false,
656
open: true,
657
source_url: "https://gitlab.com/brutaldon/brutaldon",
658
},
659
],
660
}
661
662
// Validate apps data at module load time
663
validateApps(apps)
664
665