This repository was archived by the owner on Jun 12, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
executable file
·674 lines (632 loc) · 64.1 KB
/
Copy pathindex.html
File metadata and controls
executable file
·674 lines (632 loc) · 64.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
<title>LibreLinker | Free, Libre, & Open-Source Projects — Georgia Tech</title>
<!-- Favicon -->
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🐝</text></svg>">
<!-- Canonical URL -->
<link rel="canonical" href="https://librelinker.org/">
<!-- Theme color for browser chrome -->
<meta name="theme-color" content="#003057" media="(prefers-color-scheme: light)">
<meta name="theme-color" content="#111827" media="(prefers-color-scheme: dark)">
<!-- Open Graph -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://librelinker.org/">
<meta property="og:site_name" content="LibreLinker">
<meta property="og:locale" content="en_US">
<meta property="og:title" content="LibreLinker — Free, Libre, & Open-Source Projects from Georgia Tech">
<meta property="og:description" content="A curated collection of innovative free, libre, & open-source projects from Georgia Tech spanning AI, research, hardware, and beyond. Connecting Ideas, Building Tomorrow, Fighting for Freedom.">
<meta property="og:image" content="https://librelinker.org/misc/img/GTLTC_LOGO_SOLO.avif">
<meta property="og:image:type" content="image/avif">
<meta property="og:image:width" content="649">
<meta property="og:image:height" content="912">
<meta property="og:image:alt" content="LibreTech Collective — Georgia Tech's free software club">
<!-- Twitter / X Card (name= not property= per spec) -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:url" content="https://librelinker.org/">
<meta name="twitter:title" content="LibreLinker — Free, Libre, & Open-Source Projects from Georgia Tech">
<meta name="twitter:description" content="A curated collection of innovative free, libre, & open-source projects from Georgia Tech spanning AI, research, hardware, and beyond. Connecting Ideas, Building Tomorrow, Fighting for Freedom.">
<meta name="twitter:image" content="https://librelinker.org/misc/img/GTLTC_LOGO_SOLO.avif">
<meta name="twitter:image:alt" content="LibreTech Collective — Georgia Tech's free software club">
<!-- SEO Meta -->
<meta name="description" content="A curated collection of innovative free, libre, & open-source projects from Georgia Tech spanning AI, research, hardware, and beyond. Connecting Ideas, Building Tomorrow, Fighting for Freedom.">
<meta name="keywords" content="free software, open source, FOSS, libre, Georgia Tech, LibreTech Collective, AI projects, research software, hardware projects, student projects, GPL, open-source directory">
<meta name="author" content="LibreTech Collective">
<meta name="robots" content="index, follow">
<!-- Preconnect to critical origins -->
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin>
<link rel="preconnect" href="https://scripts.simpleanalyticscdn.com" crossorigin>
<link rel="dns-prefetch" href="https://queue.simpleanalyticscdn.com">
<link rel="dns-prefetch" href="https://static.cloudflareinsights.com">
<!-- Preload critical resources -->
<link rel="preload" href="projects.json" as="fetch" crossorigin>
<!-- LibreJS License Information -->
<link rel="jslicense" type="text/html" href="javascript-licenses.html">
<!-- 100% privacy-first analytics -->
<!-- @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat -->
<script data-collect-dnt="true" async src="https://scripts.simpleanalyticscdn.com/latest.js" data-jslicense="1"></script>
<!-- @license-end -->
<!-- EmailJS for client-side email sending -->
<!-- @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat -->
<script defer type="text/javascript" src="https://cdn.jsdelivr.net/npm/@emailjs/browser@4/dist/email.min.js" data-jslicense="1"></script>
<!-- @license-end -->
<!-- JSON-LD structured data -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebSite",
"@id": "https://librelinker.org/#website",
"url": "https://librelinker.org/",
"name": "LibreLinker",
"description": "A curated collection of innovative free, libre, & open-source projects from Georgia Tech spanning AI, research, hardware, and beyond.",
"inLanguage": "en-US",
"publisher": { "@id": "https://librelinker.org/#organization" }
},
{
"@type": "Organization",
"@id": "https://librelinker.org/#organization",
"name": "LibreTech Collective",
"url": "https://ltc.gtorg.gatech.edu/",
"logo": {
"@type": "ImageObject",
"url": "https://librelinker.org/misc/img/GTLTC_LOGO_SOLO.avif",
"width": 649,
"height": 912
},
"sameAs": [
"https://github.com/LTC-GT",
"https://www.linkedin.com/company/gtltc",
"https://www.instagram.com/libretechcollectivegt/",
"https://mastodon.social/@libretechcollectivegt",
"https://bsky.app/profile/libretechgatech.bsky.social",
"https://www.reddit.com/u/gtltc"
]
}
]
}
</script>
<!-- Tailwind CSS processed by Lume -->
<link rel="stylesheet" href="/src/styles.css">
<style>
@keyframes wiggle {
0%, 100% { transform: rotate(0deg); }
25% { transform: rotate(-8deg); }
50% { transform: rotate(8deg); }
75% { transform: rotate(-4deg); }
}
.wiggle-on-hover:hover {
animation: wiggle 0.4s ease-in-out;
}
@keyframes rotate360 {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.spin-once {
animation: rotate360 0.5s ease-in-out;
}
/* Pinch-to-zoom table styles */
.overflow-x-auto {
touch-action: pan-x pan-y;
display: flex;
justify-content: center;
}
.overflow-x-auto table {
transform-origin: top center;
will-change: transform;
min-width: 100%;
}
/* Critical CSS for layout - ensures page structure even if Tailwind is delayed */
body {
margin: 0 !important;
padding: 0 !important;
font-family: system-ui, -apple-system, sans-serif;
}
header, footer {
flex-shrink: 0 !important;
}
/* Critical styles for LCP element */
main > div:first-child {
contain: layout style paint;
}
/* Improve rendering performance */
.container {
max-width: 1280px;
margin-left: auto;
margin-right: auto;
}
/* Optimize animations */
.transition-colors,
.hover\\:text-brand-gold {
will-change: auto;
}
</style>
</head>
<body class="bg-white dark:bg-gray-900 transition-colors duration-200">
<svg xmlns="http://www.w3.org/2000/svg" class="hidden" aria-hidden="true" focusable="false">
<symbol id="icon-bender-head" viewBox="0 0 22 38">
<path transform="translate(-26 -19)" fill="currentColor" fill-opacity="1" stroke-width="0.2" stroke-linejoin="round" d="M 37,19C 38.1046,19 39,19.8954 39,21C 39,21.8215 38.2547,22.5274 37.5464,22.8352L 38.0834,28.0005C 41.9109,28.0452 44.9999,31.1619 44.9999,35L 45,38L 43.9999,38C 46.2091,38 47.9999,39.7909 47.9999,42L 47.9999,44C 47.9999,46.2091 46.2092,47.9999 44.0002,48L 45,48L 45,55.6003C 43.1755,56.4503 40.2712,57 37,57C 33.7288,57 30.8245,56.4503 29,55.6003L 29,48L 29.9997,48C 27.7907,47.9999 26,46.2091 26,44L 26,42C 26,39.7909 27.7908,38 30,38L 29,38L 29,35C 29,31.1619 32.089,28.0452 35.9166,28.0005L 36.4536,22.8352C 35.7453,22.5274 35,21.8215 35,21C 35,19.8954 35.8954,19 37,19 Z M 43.9999,39.0001L 29.9999,39.0001C 28.3431,39.0001 26.9999,40.3432 26.9999,42.0001L 26.9999,44.0001C 26.9999,45.6569 28.3431,47.0001 29.9999,47.0001L 43.9999,47.0001C 45.6567,47.0001 46.9999,45.6569 46.9999,44.0001L 46.9999,42.0001C 46.9999,40.3432 45.6567,39.0001 43.9999,39.0001 Z M 37,49.25L 36,49.0145L 36,51L 38,51L 38,49.0145L 37,49.25 Z M 43.9999,51C 44,49 43.2371,49.323 42,48.9954L 42,51L 43.9999,51 Z M 39,49.0609L 39,51L 41,51L 41,49.0331L 39,49.0609 Z M 33,49.0331L 33,51L 35,51L 35,49.0609L 33,49.0331 Z M 30,51L 32,51L 32,48.9954C 30.7628,49.323 30,49 30,51 Z M 37,54L 38,53.9772L 38,52L 36,52L 36,53.9772L 37,54 Z M 43.6475,52L 42,52L 42,53.1936C 42.7917,52.8545 43.3305,52.4373 43.6475,52 Z M 39,52L 39,53.9024C 39.7607,53.823 40.4253,53.6981 41,53.5394L 41,52L 39,52 Z M 33,52L 33,53.5L 32.8616,53.5C 33.4673,53.6776 34.1774,53.8165 35,53.9024L 35,52L 33,52 Z M 30.3523,52C 30.6694,52.4373 31.2082,52.8545 32,53.1936L 32,52L 30.3523,52 Z M 32,42L 34,42L 34,44L 32,44L 32,42 Z M 40,42L 42,42L 42,44L 40,44L 40,42 Z M 29.9999,40.0001L 31.1961,40.0001C 30.1797,40.6125 29.5,41.7269 29.5,43C 29.5,44.2732 30.1798,45.3876 31.1963,46.0001L 29.9999,46.0001C 28.8954,46.0001 27.9999,45.1046 27.9999,44.0001L 27.9999,42.0001C 27.9999,40.8955 28.8954,40.0001 29.9999,40.0001 Z M 43.9999,40.0001C 45.1044,40.0001 45.9999,40.8955 45.9999,42.0001L 45.9999,44.0001C 45.9999,45.1046 45.1044,46.0001 43.9999,46.0001L 42.8037,46.0001C 43.8202,45.3876 44.5,44.2732 44.5,43C 44.5,41.7269 43.8202,40.6125 42.8039,40.0001L 43.9999,40.0001 Z M 34.8037,46.0001C 35.8202,45.3876 36.5,44.2732 36.5,43C 36.5,41.7269 35.8202,40.6125 34.8039,40.0001L 39.1961,40.0001C 38.1797,40.6125 37.5,41.7269 37.5,43C 37.5,44.2732 38.1798,45.3876 39.1963,46.0001L 34.8037,46.0001 Z "/>
</symbol>
</svg>
<!-- 100% privacy-first analytics (noscript fallback must be in body) -->
<!-- @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt Expat -->
<noscript><img src="https://queue.simpleanalyticscdn.com/noscript.gif?collect-dnt=true" alt="Analytics" width="1" height="1" referrerpolicy="no-referrer-when-downgrade"/></noscript>
<!-- @license-end -->
<!-- Main Application Script -->
<!-- @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-3.0-or-later -->
<script type="module" src="/app.js" data-jslicense="1"></script>
<!-- @license-end -->
<!-- Header -->
<header class="bg-brand-navy text-white shadow-lg flex-shrink-0">
<div class="container mx-auto px-4 sm:px-6 py-3 sm:py-4">
<div class="flex items-center justify-between">
<div class="flex items-center space-x-2 sm:space-x-4">
<img src="misc/img/GTLTC_LOGO_SOLO.avif" alt="LibreLinker Logo" class="h-8 sm:h-12 w-auto wiggle-on-hover" width="649" height="912" loading="eager">
<div>
<h1 class="text-lg sm:text-2xl font-bold">LibreLinker</h1>
<p class="text-brand-gold text-xs hidden sm:block">Connecting Ideas, Building Tomorrow, Fighting for Freedom</p>
</div>
</div>
<div class="flex items-center gap-2 sm:gap-3">
<button id="info-toggle"
class="p-2 rounded-lg bg-white/10 hover:bg-white/20 transition-colors sm:hidden"
aria-label="Show info">
<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clip-rule="evenodd"></path>
</svg>
</button>
<button id="theme-toggle"
class="p-2 rounded-lg bg-white/10 hover:bg-white/20 transition-colors"
aria-label="Toggle dark mode">
<svg id="theme-icon-sun" class="w-5 h-5 hidden" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z" clip-rule="evenodd"></path>
</svg>
<svg id="theme-icon-moon" class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20">
<path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path>
</svg>
</button>
<a href="https://ltc.gtorg.gatech.edu/"
target="_blank"
rel="noopener noreferrer"
class="px-3 sm:px-4 py-1.5 sm:py-2 bg-brand-gold text-white text-xs sm:text-sm font-medium rounded-lg hover:bg-brand-gold/90 transition-colors whitespace-nowrap">
<span class="hidden sm:inline">LibreTech Collective Homepage</span>
<span class="sm:hidden">LTC Homepage</span>
</a>
</div>
</div>
</div>
</header>
<!-- Main Content -->
<main>
<div class="container mx-auto px-4 sm:px-6 py-6 sm:py-8">
<div class="text-center max-w-4xl mx-auto">
<h2 class="text-2xl sm:text-3xl font-bold text-brand-navy dark:text-brand-gold mb-3 sm:mb-4">Discover Free Software & Hardware Projects</h2>
<p class="text-gray-700 dark:text-gray-300 text-sm sm:text-base mb-2 leading-relaxed">
A curated collection of innovative open projects spanning AI, chemistry, hardware, and beyond - all seeking contributors!
</p>
<p class="text-gray-600 dark:text-gray-400 text-xs sm:text-sm leading-relaxed">
All projects <a href="https://www.gnu.org/philosophy/free-sw.en.html" target="_blank" rel="noopener noreferrer" class="text-brand-gold hover:underline">respect your freedom</a> and are GPL compatible. <span class="font-medium">Most all are led by Georgia Tech students, faculty, and alumni</span>.
<br class="hidden sm:block">
<a href="https://ltc.gtorg.gatech.edu/" target="_blank" rel="noopener noreferrer" class="text-brand-gold hover:underline font-medium">LibreTech Collective</a>, Georgia Tech's only Free, Libre, & Open-Source club, invites you to explore, contribute, and make an impact!
</p>
<p class="text-gray-600 dark:text-gray-400 text-xs sm:text-sm mt-2">
Thanks to <a href="https://ospo.cc.gatech.edu/" target="_blank" rel="noopener noreferrer" class="text-brand-gold hover:underline">GT-OSPO</a> for helping assemble parts of this list.
</p>
</div>
<!-- Filter Section -->
<div class="mt-4 sm:mt-6">
<div class="flex items-center justify-center gap-2 flex-wrap">
<span class="text-xs sm:text-sm font-medium text-gray-600 dark:text-gray-300 w-full sm:w-auto text-center sm:text-left mb-1 sm:mb-0">Filter by type:</span>
<button data-filter-type="ai" class="px-2 sm:px-3 py-1 sm:py-1.5 rounded-lg text-xs sm:text-sm font-medium transition-colors bg-gray-100 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 flex items-center gap-1 sm:gap-1.5">
<svg class="w-4 h-4 fill-current shrink-0 transform scale-[1.15] origin-center" viewBox="0 0 22 38" aria-hidden="true">
<use href="#icon-bender-head"></use>
</svg>
AI/ML
</button>
<button data-filter-type="academic" class="px-2 sm:px-3 py-1 sm:py-1.5 rounded-lg text-xs sm:text-sm font-medium transition-colors bg-gray-100 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 flex items-center gap-1 sm:gap-1.5">
<svg class="w-4 h-4 shrink-0" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path d="M11.7 2.805a.75.75 0 0 1 .6 0A60.65 60.65 0 0 1 22.83 8.72a.75.75 0 0 1-.231 1.337 49.948 49.948 0 0 0-9.902 3.912l-.003.002c-.114.06-.227.119-.34.18a.75.75 0 0 1-.707 0A50.88 50.88 0 0 0 7.5 12.173v-.224c0-.131.067-.248.172-.311a54.615 54.615 0 0 1 4.653-2.52.75.75 0 0 0-.65-1.352 56.123 56.123 0 0 0-4.78 2.589 1.858 1.858 0 0 0-.859 1.228 49.803 49.803 0 0 0-4.634-1.527.75.75 0 0 1-.231-1.337A60.653 60.653 0 0 1 11.7 2.805Z"/>
<path d="M13.06 15.473a48.45 48.45 0 0 1 7.666-3.282c.134 1.414.22 2.843.255 4.284a.75.75 0 0 1-.46.711 47.87 47.87 0 0 0-8.105 4.342.75.75 0 0 1-.832 0 47.87 47.87 0 0 0-8.104-4.342.75.75 0 0 1-.461-.71c.035-1.442.121-2.87.255-4.286.921.304 1.83.634 2.726.99v1.27a1.5 1.5 0 0 0-.14 2.508c-.09.38-.222.753-.397 1.11.452.213.901.434 1.346.66a6.727 6.727 0 0 0 .551-1.607 1.5 1.5 0 0 0 .14-2.67v-.645a48.549 48.549 0 0 1 3.44 1.667 2.25 2.25 0 0 0 2.12 0Z"/>
<path d="M4.462 19.462c.42-.419.753-.89 1-1.395.453.214.902.435 1.347.662a6.742 6.742 0 0 1-1.286 1.794.75.75 0 0 1-1.06-1.06Z"/>
</svg>
Academic
</button>
<button data-filter-type="research" class="px-2 sm:px-3 py-1 sm:py-1.5 rounded-lg text-xs sm:text-sm font-medium transition-colors bg-gray-100 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 flex items-center gap-1 sm:gap-1.5">
<svg class="w-4 h-4 shrink-0" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path fill-rule="evenodd" d="M10.5 3.798v5.02a3 3 0 0 1-.879 2.121l-2.377 2.377a9.845 9.845 0 0 1 5.091 1.013 8.315 8.315 0 0 0 5.713.636l.285-.071-3.954-3.955a3 3 0 0 1-.879-2.121v-5.02a23.614 23.614 0 0 0-3 0Zm4.5.138a.75.75 0 0 0 .093-1.495A24.837 24.837 0 0 0 12 2.25a25.048 25.048 0 0 0-3.093.191A.75.75 0 0 0 9 3.936v4.882a1.5 1.5 0 0 1-.44 1.06l-6.293 6.294c-1.62 1.621-.903 4.475 1.471 4.88 2.686.46 5.447.698 8.262.698 2.816 0 5.576-.239 8.262-.697 2.373-.406 3.092-3.26 1.47-4.881L15.44 9.879A1.5 1.5 0 0 1 15 8.818V3.936Z" clip-rule="evenodd"/>
</svg>
Research
</button>
<button data-filter-type="hardware" class="px-2 sm:px-3 py-1 sm:py-1.5 rounded-lg text-xs sm:text-sm font-medium transition-colors bg-gray-100 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 flex items-center gap-1 sm:gap-1.5">
<svg class="w-4 h-4 shrink-0" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path d="M16.5 7.5h-9v9h9v-9Z"/>
<path fill-rule="evenodd" d="M8.25 2.25A.75.75 0 0 1 9 3v.75h2.25V3a.75.75 0 0 1 1.5 0v.75H15V3a.75.75 0 0 1 1.5 0v.75h.75a3 3 0 0 1 3 3v.75H21A.75.75 0 0 1 21 9h-.75v2.25H21a.75.75 0 0 1 0 1.5h-.75V15H21a.75.75 0 0 1 0 1.5h-.75v.75a3 3 0 0 1-3 3h-.75V21a.75.75 0 0 1-1.5 0v-.75h-2.25V21a.75.75 0 0 1-1.5 0v-.75H9V21a.75.75 0 0 1-1.5 0v-.75h-.75a3 3 0 0 1-3-3v-.75H3A.75.75 0 0 1 3 15h.75v-2.25H3a.75.75 0 0 1 0-1.5h.75V9H3a.75.75 0 0 1 0-1.5h.75v-.75a3 3 0 0 1 3-3h.75V3a.75.75 0 0 1 .75-.75ZM6 6.75A.75.75 0 0 1 6.75 6h10.5a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75H6.75a.75.75 0 0 1-.75-.75V6.75Z" clip-rule="evenodd"/>
</svg>
Hardware
</button>
<button data-filter-type="web" class="px-2 sm:px-3 py-1 sm:py-1.5 rounded-lg text-xs sm:text-sm font-medium transition-colors bg-gray-100 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 flex items-center gap-1 sm:gap-1.5">
<svg class="w-4 h-4 shrink-0" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path d="M21.721 12.752a9.711 9.711 0 0 0-.945-5.003 12.754 12.754 0 0 1-4.339 2.708 18.991 18.991 0 0 1-.214 4.772 17.165 17.165 0 0 0 5.498-2.477ZM14.634 15.55a17.324 17.324 0 0 0 .332-4.647c-.952.227-1.945.347-2.966.347-1.021 0-2.014-.12-2.966-.347a17.515 17.515 0 0 0 .332 4.647 17.385 17.385 0 0 0 5.268 0ZM9.772 17.119a18.963 18.963 0 0 0 4.456 0A17.182 17.182 0 0 1 12 21.724a17.18 17.18 0 0 1-2.228-4.605ZM7.777 15.23a18.87 18.87 0 0 1-.214-4.774 12.753 12.753 0 0 1-4.34-2.708 9.711 9.711 0 0 0-.944 5.004 17.165 17.165 0 0 0 5.498 2.477ZM21.356 14.752a9.765 9.765 0 0 1-7.478 6.817 18.64 18.64 0 0 0 1.988-4.718 18.627 18.627 0 0 0 5.49-2.098ZM2.644 14.752c1.682.971 3.53 1.688 5.49 2.099a18.64 18.64 0 0 0 1.988 4.718 9.765 9.765 0 0 1-7.478-6.816ZM13.878 2.43a9.755 9.755 0 0 1 6.116 3.986 11.267 11.267 0 0 1-3.746 2.504 18.63 18.63 0 0 0-2.37-6.49ZM12 2.276a17.152 17.152 0 0 1 2.805 7.121c-.897.23-1.837.353-2.805.353-.968 0-1.908-.122-2.805-.353A17.151 17.151 0 0 1 12 2.276ZM10.122 2.43a18.629 18.629 0 0 0-2.37 6.49 11.266 11.266 0 0 1-3.746-2.504 9.754 9.754 0 0 1 6.116-3.985Z"/>
</svg>
Web
</button>
<button data-filter-type="enterprise" class="px-2 sm:px-3 py-1 sm:py-1.5 rounded-lg text-xs sm:text-sm font-medium transition-colors bg-gray-100 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 flex items-center gap-1 sm:gap-1.5">
<svg class="w-4 h-4 shrink-0" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path fill-rule="evenodd" d="M3 2.25a.75.75 0 0 0 0 1.5v16.5h-.75a.75.75 0 0 0 0 1.5H15v-18a.75.75 0 0 0 0-1.5H3ZM6.75 19.5v-2.25a.75.75 0 0 1 .75-.75h3a.75.75 0 0 1 .75.75v2.25a.75.75 0 0 1-.75.75h-3a.75.75 0 0 1-.75-.75ZM6 6.75A.75.75 0 0 1 6.75 6h.75a.75.75 0 0 1 0 1.5h-.75A.75.75 0 0 1 6 6.75ZM6.75 9a.75.75 0 0 0 0 1.5h.75a.75.75 0 0 0 0-1.5h-.75ZM6 12.75a.75.75 0 0 1 .75-.75h.75a.75.75 0 0 1 0 1.5h-.75a.75.75 0 0 1-.75-.75ZM10.5 6a.75.75 0 0 0 0 1.5h.75a.75.75 0 0 0 0-1.5h-.75Zm-.75 3.75A.75.75 0 0 1 10.5 9h.75a.75.75 0 0 1 0 1.5h-.75a.75.75 0 0 1-.75-.75ZM10.5 12a.75.75 0 0 0 0 1.5h.75a.75.75 0 0 0 0-1.5h-.75ZM16.5 6.75v15h5.25a.75.75 0 0 0 0-1.5H21v-12a.75.75 0 0 0 0-1.5h-4.5Zm1.5 4.5a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Zm.75 2.25a.75.75 0 0 0-.75.75v.008c0 .414.336.75.75.75h.008a.75.75 0 0 0 .75-.75v-.008a.75.75 0 0 0-.75-.75h-.008ZM18 17.25a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Z" clip-rule="evenodd"/>
</svg>
Enterprise
</button>
<button data-filter-type="plugin" class="px-2 sm:px-3 py-1 sm:py-1.5 rounded-lg text-xs sm:text-sm font-medium transition-colors bg-gray-100 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 flex items-center gap-1 sm:gap-1.5">
<svg class="w-4 h-4 shrink-0" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path d="M11.25 5.337c0-.355-.186-.676-.401-.959a1.647 1.647 0 0 1-.349-1.003c0-1.036 1.007-1.875 2.25-1.875S15 2.34 15 3.375c0 .369-.128.713-.349 1.003-.215.283-.401.604-.401.959 0 .332.278.598.61.578 1.91-.114 3.79-.342 5.632-.676a.75.75 0 0 1 .878.645 49.17 49.17 0 0 1 .376 5.452.657.657 0 0 1-.66.664c-.354 0-.675-.186-.958-.401a1.647 1.647 0 0 0-1.003-.349c-1.035 0-1.875 1.007-1.875 2.25s.84 2.25 1.875 2.25c.369 0 .713-.128 1.003-.349.283-.215.604-.401.959-.401.31 0 .557.262.534.571a48.774 48.774 0 0 1-.595 4.845.75.75 0 0 1-.61.61c-1.82.317-3.673.533-5.555.642a.58.58 0 0 1-.611-.581c0-.355.186-.676.401-.959.221-.29.349-.634.349-1.003 0-1.035-1.007-1.875-2.25-1.875s-2.25.84-2.25 1.875c0 .369.128.713.349 1.003.215.283.401.604.401.959a.641.641 0 0 1-.658.643 49.118 49.118 0 0 1-4.708-.36.75.75 0 0 1-.645-.878c.293-1.614.504-3.257.629-4.924A.53.53 0 0 0 5.337 15c-.355 0-.676.186-.959.401-.29.221-.634.349-1.003.349-1.036 0-1.875-1.007-1.875-2.25s.84-2.25 1.875-2.25c.369 0 .713.128 1.003.349.283.215.604.401.959.401a.656.656 0 0 0 .659-.663 47.703 47.703 0 0 0-.31-4.82.75.75 0 0 1 .83-.832c1.343.155 2.703.254 4.077.294a.64.64 0 0 0 .657-.642Z"/>
</svg>
Plugin
</button>
<button data-filter-type="just-for-fun" class="px-2 sm:px-3 py-1 sm:py-1.5 rounded-lg text-xs sm:text-sm font-medium transition-colors bg-gray-100 text-gray-700 hover:bg-gray-200 dark:bg-gray-700 dark:text-gray-200 dark:hover:bg-gray-600 flex items-center gap-1 sm:gap-1.5">
<svg class="w-4 h-4 shrink-0" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
<path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-2.625 6c-.54 0-.828.419-.936.634a1.96 1.96 0 0 0-.189.866c0 .298.059.605.189.866.108.215.395.634.936.634.54 0 .828-.419.936-.634.13-.26.189-.568.189-.866 0-.298-.059-.605-.189-.866-.108-.215-.395-.634-.936-.634Zm4.314.634c.108-.215.395-.634.936-.634.54 0 .828.419.936.634.13.26.189.568.189.866 0 .298-.059.605-.189.866-.108.215-.395.634-.936.634-.54 0-.828-.419-.936-.634a1.96 1.96 0 0 1-.189-.866c0-.298.059-.605.189-.866Zm2.023 6.828a.75.75 0 1 0-1.06-1.06 3.75 3.75 0 0 1-5.304 0 .75.75 0 0 0-1.06 1.06 5.25 5.25 0 0 0 7.424 0Z" clip-rule="evenodd"/>
</svg>
Just for Fun
</button>
</div>
</div>
</div>
<!-- Projects Table -->
<div class="container mx-auto px-4 sm:px-6 pb-6">
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-lg overflow-x-auto border border-gray-200 dark:border-gray-600">
<table class="w-full sm:min-w-[640px]">
<thead class="bg-brand-navy dark:bg-gray-900 text-white sticky top-0 z-10">
<tr>
<th data-sort="name" class="py-2 sm:py-3 px-2 sm:px-4 text-left font-semibold text-xs sm:text-sm w-48 sm:w-64 cursor-pointer hover:bg-brand-navy/80 transition-colors select-none">
Project <span class="sort-icon opacity-30" aria-hidden="true"><svg class="inline w-3 h-3 align-middle" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1l3 3H5l3-3zm0 14l-3-3h6l-3 3z"/></svg></span>
</th>
<th class="py-2 sm:py-3 px-2 sm:px-4 text-left font-semibold text-xs sm:text-sm">Description</th>
<th class="py-2 sm:py-3 px-2 sm:px-4 text-left font-semibold text-xs sm:text-sm w-20 sm:w-24">Type</th>
<th class="py-2 sm:py-3 px-2 sm:px-4 text-left font-semibold text-xs sm:text-sm w-40 sm:w-56">Technologies</th>
<th data-sort="yearStarted" class="py-2 sm:py-3 px-2 sm:px-4 text-center font-semibold text-xs sm:text-sm w-16 sm:w-24 cursor-pointer hover:bg-brand-navy/80 transition-colors select-none">
Year <span class="sort-icon opacity-30" aria-hidden="true"><svg class="inline w-3 h-3 align-middle" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1l3 3H5l3-3zm0 14l-3-3h6l-3 3z"/></svg></span>
</th>
<th data-sort="license" class="py-2 sm:py-3 px-2 sm:px-4 text-center font-semibold text-xs sm:text-sm w-24 sm:w-32 cursor-pointer hover:bg-brand-navy/80 transition-colors select-none">
License <span class="sort-icon opacity-30" aria-hidden="true"><svg class="inline w-3 h-3 align-middle" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1l3 3H5l3-3zm0 14l-3-3h6l-3 3z"/></svg></span>
</th>
<th data-sort="status" class="py-2 sm:py-3 px-2 sm:px-4 text-center font-semibold text-xs sm:text-sm w-20 sm:w-28 cursor-pointer hover:bg-brand-navy/80 transition-colors select-none">
Status <span class="sort-icon opacity-30" aria-hidden="true"><svg class="inline w-3 h-3 align-middle" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1l3 3H5l3-3zm0 14l-3-3h6l-3 3z"/></svg></span>
</th>
<th data-sort="ltcSupported" class="py-2 sm:py-3 px-2 sm:px-4 text-center font-semibold text-xs sm:text-sm w-20 sm:w-24 cursor-pointer hover:bg-brand-navy/80 transition-colors select-none">
<div class="flex items-center justify-center gap-1">
<span>LTC Supported?</span>
<div class="inline-block">
<button
type="button"
id="ltc-help-btn"
class="w-4 h-4 rounded-full bg-brand-gold text-brand-navy text-xs flex items-center justify-center hover:bg-brand-navy hover:text-white transition-colors cursor-help"
aria-label="Help about LTC Supported projects"
onclick="event.stopPropagation();">
?
</button>
</div>
<span class="sort-icon opacity-30" aria-hidden="true"><svg class="inline w-3 h-3 align-middle" viewBox="0 0 16 16" fill="currentColor"><path d="M8 1l3 3H5l3-3zm0 14l-3-3h6l-3 3z"/></svg></span>
</div>
</th>
</tr>
</thead>
<tbody id="projects-tbody">
<!-- Projects will be loaded here -->
<tr>
<td colspan="7" class="text-center py-8">
<div class="inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-brand-gold"></div>
<p class="text-gray-500 mt-2 text-sm">Loading projects...</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- LTC Tooltip (fixed positioned to escape table container) -->
<div
id="ltc-tooltip"
class="hidden fixed w-56 sm:w-64 bg-brand-navy text-white text-xs rounded-lg p-3 shadow-xl z-[9999] pointer-events-none">
<p class="mb-2">Projects marked with ✅ are supported by the LibreTech Collective (LTC). These projects benefit from direct communication channels with their developers, ensuring responsive support and community engagement.</p>
<a href="https://ltc.gtorg.gatech.edu/main-page/what-is-free-software/" target="_blank" rel="noopener noreferrer" class="text-brand-gold hover:underline pointer-events-auto">Learn more about what LTC supports →</a>
<div class="absolute top-full left-1/2 transform -translate-x-1/2 -mt-1 w-0 h-0 border-l-4 border-r-4 border-t-4 border-transparent border-t-brand-navy"></div>
</div>
<!-- Separator -->
<div class="container mx-auto px-4 sm:px-6 py-6 sm:py-8">
<div class="border-t border-gray-200"></div>
</div>
<!-- FAQ Section -->
<section class="bg-white dark:bg-gray-900 py-6 sm:py-8">
<div class="container mx-auto px-4 sm:px-6">
<div class="max-w-3xl mx-auto">
<h3 class="text-xl sm:text-2xl font-bold text-brand-navy dark:text-brand-gold mb-6 text-center">Frequently Asked Questions</h3>
<div class="space-y-3">
<!-- FAQ Item 1 -->
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-md border border-gray-200 dark:border-gray-700 overflow-hidden">
<button class="faq-toggle w-full px-4 sm:px-6 py-4 text-left flex items-center justify-between hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors focus:outline-none focus:ring-2 focus:ring-brand-gold focus:ring-inset" aria-expanded="false">
<span class="text-sm sm:text-base font-semibold text-gray-900 dark:text-white pr-4">What is this list I'm looking at?</span>
<svg class="faq-icon w-5 h-5 text-brand-gold transition-transform duration-200 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
</svg>
</button>
<div class="faq-content hidden px-4 sm:px-6 pb-4">
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed">
All projects above have been reviewed by the LibreTech Collective at Georgia Tech and approved for development by LTC. These licenses are all GPL compatible, meaning they respect your freedom to run, study, share, and modify the code.
</p>
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed mt-3">
These projects are all either run by Georgia Tech students, faculty, or alumni - or are large community-based projects (like Apache & Apereo) based here at Georgia Tech.
</p>
</div>
</div>
<!-- FAQ Item 2 -->
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-md border border-gray-200 dark:border-gray-700 overflow-hidden">
<button class="faq-toggle w-full px-4 sm:px-6 py-4 text-left flex items-center justify-between hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors focus:outline-none focus:ring-2 focus:ring-brand-gold focus:ring-inset" aria-expanded="false">
<span class="text-sm sm:text-base font-semibold text-gray-900 dark:text-white pr-4">How can I get on this list? What does it mean for my project?</span>
<svg class="faq-icon w-5 h-5 text-brand-gold transition-transform duration-200 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
</svg>
</button>
<div class="faq-content hidden px-4 sm:px-6 pb-4">
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed">
Anyone can apply for submission to the list. The two qualifications are that the project must have some sort of tie to Georgia Tech and have a GPL compatible license.
</p>
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed mt-3">
Being on this list means your project is recognized by the LibreTech Collective as upholding software freedom principles and connects you with the Georgia Tech free, libre, & open-source community.
</p>
</div>
</div>
<!-- FAQ Item 3 -->
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-md border border-gray-200 dark:border-gray-700 overflow-hidden">
<button class="faq-toggle w-full px-4 sm:px-6 py-4 text-left flex items-center justify-between hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors focus:outline-none focus:ring-2 focus:ring-brand-gold focus:ring-inset" aria-expanded="false">
<span class="text-sm sm:text-base font-semibold text-gray-900 dark:text-white pr-4">What makes a license GPL compatible? Isn't Open-Source the same thing?</span>
<svg class="faq-icon w-5 h-5 text-brand-gold transition-transform duration-200 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
</svg>
</button>
<div class="faq-content hidden px-4 sm:px-6 pb-4">
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed">
A GPL compatible license is one that allows code to be combined with GPL-licensed code. This includes licenses like MIT, Apache 2.0, BSD, and of course, the GPL itself.
</p>
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed mt-3">
These licenses all share the common goal of protecting user freedoms - the freedom to use, study, modify, and share software. They ensure that software remains free and open for everyone.
</p>
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed mt-3">
Per LibreTech policy, <a href="https://www.gnu.org/philosophy/free-sw.html" target="_blank" rel="noopener noreferrer" class="text-brand-gold hover:underline">all projects worked on by the club must be free as in freedom. Meaning it respects your 4 freedoms.</a>
</p>
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed mt-3">
Access to source code (e.g. open-source) is only a requirement of 2 of the 4 freedoms, and thus alone is not sufficent to be considered free as in freedom. When most people say "open-source", they're really referring to free software, but it can often times lead to confusion when the topic of source available software comes up.
</p>
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed mt-3">
Source available only license (e.g. BSL, SSPL, etc.) are not considered free software and thus are not allowed.
</p>
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed mt-3">
To see if your license is free as in freedom, <a href="https://www.gnu.org/licenses/license-list.en.html" target="_blank" rel="noopener noreferrer" class="text-brand-gold hover:underline"> visit this site</a> - all green and some orange licenses are permissible for acceptance onto this list. If you see a license not listed, please reach out to us for clarification.
</p>
</div>
</div>
<!-- FAQ Item 4 -->
<div class="bg-white dark:bg-gray-800 rounded-lg shadow-md border border-gray-200 dark:border-gray-700 overflow-hidden">
<button class="faq-toggle w-full px-4 sm:px-6 py-4 text-left flex items-center justify-between hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors focus:outline-none focus:ring-2 focus:ring-brand-gold focus:ring-inset" aria-expanded="false">
<span class="text-sm sm:text-base font-semibold text-gray-900 dark:text-white pr-4">I see something interesting that I want to work on or learn more about - what next?</span>
<svg class="faq-icon w-5 h-5 text-brand-gold transition-transform duration-200 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path>
</svg>
</button>
<div class="faq-content hidden px-4 sm:px-6 pb-4">
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed">
<a href="https://discord.gg/E6qgerDpTr" target="_blank" rel="noopener noreferrer" class="text-brand-gold hover:underline">Join our Discord</a>, introduce yourself, and a LibreTech member will be with you shortly to explain the next steps!
</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Separator -->
<div class="container mx-auto px-4 sm:px-6 py-6 sm:py-8">
<div class="border-t border-gray-200"></div>
</div>
<!-- Contact Form -->
<section class="bg-white dark:bg-gray-900 py-6 sm:py-8 sm:pb-12">
<div class="container mx-auto px-4 sm:px-6">
<div class="max-w-2xl mx-auto">
<h3 class="text-xl sm:text-2xl font-bold text-brand-navy dark:text-brand-gold mb-3 sm:mb-4 text-center">Get In Contact</h3>
<p class="text-gray-600 dark:text-gray-400 text-xs sm:text-sm mb-4 sm:mb-6 text-center">
Have a project to add or a question? Fill out the form below and we'll get back to you!
</p>
<form id="contact-form" class="bg-white dark:bg-gray-800 rounded-lg shadow-lg border border-gray-200 dark:border-gray-700 p-4 sm:p-6 space-y-3 sm:space-y-4">
<!-- Reason Dropdown -->
<div>
<label for="reason" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
Reason for Contact <span class="text-red-500">*</span>
</label>
<select
id="reason"
name="reason"
required
class="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-white rounded-lg focus:ring-2 focus:ring-brand-gold focus:border-transparent">
<option value="">Select a reason...</option>
<option value="LIBRELINKER: NEW PROJECT ADDITION REQUEST">New Project Addition Request</option>
<option value="LIBRELINKER: PROJECT UPDATE REQUEST">Project Update Request</option>
<option value="LIBRELINKER: GENERAL INQUIRY">General Inquiry</option>
<option value="LIBRELINKER: BUG REPORT">Bug Report</option>
<option value="LIBRELINKER: FEEDBACK">Feedback</option>
</select>
</div>
<!-- Name -->
<div>
<label for="user_name" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
Name <span class="text-red-500">*</span>
</label>
<input
type="text"
id="user_name"
name="user_name"
required
placeholder="George P. Burdell"
class="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-white rounded-lg focus:ring-2 focus:ring-brand-gold focus:border-transparent">
</div>
<!-- User Email -->
<div>
<label for="user_email" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
Your Email Address <span class="text-red-500">*</span>
</label>
<input
type="email"
id="user_email"
name="user_email"
required
placeholder="gburdell3@gatech.edu"
class="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-white rounded-lg focus:ring-2 focus:ring-brand-gold focus:border-transparent">
</div>
<!-- Message -->
<div>
<label for="message" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
Message <span class="text-red-500">*</span>
</label>
<textarea
id="message"
name="message"
rows="5"
required
placeholder="Please provide detailed information about your request, including project name, description, goals, technologies used, and any other relevant details..."
class="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-white rounded-lg focus:ring-2 focus:ring-brand-gold focus:border-transparent resize-none"></textarea>
</div>
<!-- GPL License Confirmation (for project additions/updates) -->
<div id="gpl_confirm_container" class="flex items-start hidden">
<input
type="checkbox"
id="gpl_confirm"
name="gpl_confirm"
class="mt-1 h-4 w-4 text-brand-gold focus:ring-brand-gold border-gray-300 rounded">
<label for="gpl_confirm" class="ml-2 text-sm text-gray-700 dark:text-gray-300 flex items-center gap-1.5">
<span>I confirm this project features a GPL compatible license <span class="text-red-500">*</span></span>
<div class="relative inline-block">
<button
type="button"
id="gpl-help-btn"
class="w-4 h-4 rounded-full bg-brand-navy text-white text-xs flex items-center justify-center hover:bg-brand-gold transition-colors cursor-help"
aria-label="Help about GPL compatible licenses">
?
</button>
<div
id="gpl-tooltip"
class="hidden absolute bottom-full right-0 sm:left-1/2 sm:transform sm:-translate-x-1/2 mb-2 w-64 sm:w-72 bg-brand-navy text-white text-xs rounded-lg p-3 shadow-lg z-50">
<p class="mb-2">Per LibreTech policy, all projects worked on by the club must be free software. Meaning it respects your 4 freedoms.</p>
<a href="https://www.gnu.org/philosophy/free-sw.en.html" target="_blank" rel="noopener noreferrer" class="text-brand-gold hover:underline">Learn about the 4 freedoms →</a>
<p class="mt-2">LTC doesn't take sides in the copyleft vs. permissive license debate; our priority is protecting users' freedom. Permissive GPL-compatible licenses (for example, Apache 2.0 and MIT) are always permitted.</p>
<div class="absolute top-full left-1/2 transform -translate-x-1/2 -mt-1 w-0 h-0 border-l-4 border-r-4 border-t-4 border-transparent border-t-brand-navy"></div>
</div>
</div>
</label>
</div>
<!-- Georgia Tech Affiliation -->
<div>
<label for="gt_affiliation" class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
Georgia Tech Affiliation <span class="text-red-500">*</span>
</label>
<select
id="gt_affiliation"
name="gt_affiliation"
required
class="w-full px-4 py-2 border border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-white rounded-lg focus:ring-2 focus:ring-brand-gold focus:border-transparent">
<option value="">Select your affiliation...</option>
<option value="I'm with Georgia Tech">I'm with Georgia Tech</option>
<option value="I'm not with Georgia Tech">I'm not with Georgia Tech</option>
</select>
</div>
<!-- Custom Bot Prevention -->
<div id="bot-prevention-widget" class="bg-gray-50 dark:bg-gray-700 rounded-lg p-4 border-2 border-gray-300 dark:border-gray-600">
<div class="text-center mb-3">
<p class="text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">Verify you're human</p>
<div class="bg-white dark:bg-gray-800 rounded px-4 py-3 mb-3 border border-gray-300 dark:border-gray-600 relative overflow-hidden">
<p class="text-xs text-gray-600 dark:text-gray-400 mb-2">Type the text below (case sensitive):</p>
<div id="captcha-text" class="font-mono text-2xl font-bold text-gray-800 dark:text-gray-200 select-none min-h-[60px] flex items-center justify-center relative" style="user-select: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; filter: contrast(0.85) blur(0.4px) brightness(0.95);"></div>
<div style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: none; background: repeating-linear-gradient(45deg, transparent, transparent 3px, rgba(128,128,128,0.04) 3px, rgba(128,128,128,0.04) 6px), repeating-linear-gradient(-45deg, transparent, transparent 3px, rgba(128,128,128,0.03) 3px, rgba(128,128,128,0.03) 6px);"></div>
<div style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; pointer-events: none; background: radial-gradient(circle at 30% 40%, rgba(200,200,200,0.1) 0%, transparent 50%), radial-gradient(circle at 70% 60%, rgba(150,150,150,0.08) 0%, transparent 50%);"></div>
<button id="captcha-refresh" type="button" class="absolute top-2 right-2 p-1.5 rounded-md bg-gray-100 hover:bg-gray-200 dark:bg-gray-700 dark:hover:bg-gray-600 text-gray-700 dark:text-gray-200" aria-label="Refresh captcha" title="Refresh">
<span id="captcha-refresh-icon" class="block leading-none text-base">🔄</span>
</button>
</div>
<input
type="text"
id="captcha-input"
autocomplete="off"
spellcheck="false"
autocapitalize="off"
autocorrect="off"
inputmode="latin"
class="w-full px-3 py-2 border border-gray-300 dark:border-gray-600 dark:bg-gray-800 dark:text-white rounded-lg focus:ring-2 focus:ring-brand-gold focus:border-transparent text-center font-mono"
placeholder="Type here..."
/>
<div id="captcha-feedback" class="mt-2 text-xs font-medium min-h-[1.25rem]"></div>
</div>
</div>
<!-- Submit Button -->
<div class="pt-2">
<button
type="submit"
id="submit-btn"
disabled
class="w-full bg-gray-300 text-gray-500 py-3 px-6 rounded-lg font-medium transition-colors cursor-not-allowed">
Send Message
</button>
</div>
<!-- Success/Error Message -->
<div id="form-message" class="hidden text-center text-sm"></div>
</form>
</div>
</div>
</section>
</main>
<!-- Footer -->
<footer class="bg-brand-navy text-white flex-shrink-0 hidden sm:block sm:fixed sm:bottom-0 sm:left-0 sm:right-0 sm:z-40">
<div class="container mx-auto px-4 sm:px-6 py-2">
<div class="flex flex-col sm:flex-row items-center justify-between gap-2">
<p class="text-[10px] sm:text-xs text-gray-300 flex items-center gap-1">
<a href="https://github.com/LTC-GT/LibreLinker/blob/main/LICENSE.md" target="_blank" rel="noopener noreferrer" class="text-brand-gold hover:underline"><span style="display:inline-block;transform:scaleX(-1)">©</span> LibreLinker — GNU GPL v3, Free As In Freedom</a> • Built with ❤️ in Atlanta, Georgia <a href="https://gatech.edu" target="_blank" rel="noopener noreferrer" class="hover:opacity-80 transition-opacity" aria-label="Visit Georgia Tech"><img class="inline-block h-5 w-auto align-middle" src="misc/img/us-flag.svg" alt="US Flag" width="20" height="15" loading="lazy"></a> by <a href="https://ltc.gtorg.gatech.edu/" target="_blank" rel="noopener noreferrer" class="text-brand-gold hover:underline">LibreTech Collective @ Georgia Tech</a>
</p>
<div class="flex items-center gap-3 pr-2">
<a href="https://github.com/LTC-GT" target="_blank" rel="noopener noreferrer" class="hover:opacity-80 transition-opacity" aria-label="View on GitHub">
<svg class="w-5 h-5 fill-current text-gray-300 hover:text-brand-gold transition-colors" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"></path>
</svg>
</a>
<a href="https://www.linkedin.com/company/gtltc" target="_blank" rel="noopener noreferrer" class="hover:opacity-80 transition-opacity" aria-label="Visit our LinkedIn">
<svg class="w-5 h-5 fill-current text-gray-300 hover:text-brand-gold transition-colors" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path d="M0 1.146C0 .513.526 0 1.175 0h13.65C15.474 0 16 .513 16 1.146v13.708c0 .633-.526 1.146-1.175 1.146H1.175C.526 16 0 15.487 0 14.854V1.146zm4.943 12.248V6.169H2.542v7.225h2.401zm-1.2-8.212c.837 0 1.358-.554 1.358-1.248-.015-.709-.52-1.248-1.342-1.248-.822 0-1.359.54-1.359 1.248 0 .694.521 1.248 1.327 1.248h.016zm4.908 8.212V9.359c0-.216.016-.432.08-.586.173-.431.568-.878 1.232-.878.869 0 1.216.662 1.216 1.634v3.865h2.401V9.25c0-2.22-1.184-3.252-2.764-3.252-1.274 0-1.845.7-2.165 1.193v.025h-.016a5.54 5.54 0 0 1 .016-.025V6.169h-2.4c.03.678 0 7.225 0 7.225h2.4z"></path>
</svg>
</a>
<a href="https://www.instagram.com/libretechcollectivegt/" target="_blank" rel="noopener noreferrer" class="hover:opacity-80 transition-opacity" aria-label="Follow us on Instagram">
<svg class="w-5 h-5 fill-current text-gray-300 hover:text-brand-gold transition-colors" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path d="M8 0C5.829 0 5.556.01 4.703.048 3.85.088 3.269.222 2.76.42a3.917 3.917 0 0 0-1.417.923A3.927 3.927 0 0 0 .42 2.76C.222 3.268.087 3.85.048 4.7.01 5.555 0 5.827 0 8.001c0 2.172.01 2.444.048 3.297.04.852.174 1.433.372 1.942.205.526.478.972.923 1.417.444.445.89.719 1.416.923.51.198 1.09.333 1.942.372C5.555 15.99 5.827 16 8 16s2.444-.01 3.298-.048c.851-.04 1.434-.174 1.943-.372a3.916 3.916 0 0 0 1.416-.923c.445-.445.718-.891.923-1.417.197-.509.332-1.09.372-1.942C15.99 10.445 16 10.173 16 8s-.01-2.445-.048-3.299c-.04-.851-.175-1.433-.372-1.941a3.926 3.926 0 0 0-.923-1.417A3.911 3.911 0 0 0 13.24.42c-.51-.198-1.092-.333-1.943-.372C10.443.01 10.172 0 7.998 0h.003zm-.717 1.442h.718c2.136 0 2.389.007 3.232.046.78.035 1.204.166 1.486.275.373.145.64.319.92.599.28.28.453.546.598.92.11.281.24.705.275 1.485.039.843.047 1.096.047 3.231s-.008 2.389-.047 3.232c-.035.78-.166 1.203-.275 1.485a2.47 2.47 0 0 1-.599.919c-.28.28-.546.453-.92.598-.28.11-.704.24-1.485.276-.843.038-1.096.047-3.232.047s-2.39-.009-3.233-.047c-.78-.036-1.203-.166-1.485-.276a2.478 2.478 0 0 1-.92-.598 2.48 2.48 0 0 1-.6-.92c-.109-.281-.24-.705-.275-1.485-.038-.843-.046-1.096-.046-3.233 0-2.136.008-2.388.046-3.231.036-.78.166-1.204.276-1.486.145-.373.319-.64.599-.92.28-.28.546-.453.92-.598.282-.11.705-.24 1.485-.276.738-.034 1.024-.044 2.515-.045v.002zm4.988 1.328a.96.96 0 1 0 0 1.92.96.96 0 0 0 0-1.92zm-4.27 1.122a4.109 4.109 0 1 0 0 8.217 4.109 4.109 0 0 0 0-8.217zm0 1.441a2.667 2.667 0 1 1 0 5.334 2.667 2.667 0 0 1 0-5.334z"></path>
</svg>
</a>
<a href="https://discord.gg/E6qgerDpTr" target="_blank" rel="noopener noreferrer" class="hover:opacity-80 transition-opacity" aria-label="Join our Discord">
<svg class="w-5 h-5 fill-current text-gray-300 hover:text-brand-gold transition-colors" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
<path d="M13.545 2.907a13.227 13.227 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.19 12.19 0 0 0-3.658 0 8.258 8.258 0 0 0-.412-.833.051.051 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.041.041 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032c.001.014.01.028.021.037a13.276 13.276 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019c.308-.42.582-.863.818-1.329a.05.05 0 0 0-.01-.059.051.051 0 0 0-.018-.011 8.875 8.875 0 0 1-1.248-.595.05.05 0 0 1-.02-.066.051.051 0 0 1 .015-.019c.084-.063.168-.129.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.052.052 0 0 1 .053.007c.08.066.164.132.248.195a.051.051 0 0 1-.004.085 8.254 8.254 0 0 1-1.249.594.05.05 0 0 0-.03.03.052.052 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.235 13.235 0 0 0 4.001-2.02.049.049 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.034.034 0 0 0-.02-.019Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612Zm5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612Z"></path>
</svg>
</a>
<a href="https://mastodon.social/@libretechcollectivegt" target="_blank" rel="noopener noreferrer" class="hover:opacity-80 transition-opacity" aria-label="Follow us on Mastodon">
<svg class="w-5 h-5 fill-current text-gray-300 hover:text-brand-gold transition-colors" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a4 4 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522q0-1.288.66-2.046c.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764q.662.757.661 2.046z"></path>
</svg>
</a>
<a href="https://bsky.app/profile/libretechgatech.bsky.social" target="_blank" rel="noopener noreferrer" class="hover:opacity-80 transition-opacity" aria-label="Follow us on Bluesky">
<svg class="w-5 h-5 fill-current text-gray-300 hover:text-brand-gold transition-colors" viewBox="0 0 600 530" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z"></path>
</svg>
</a>
<a href="https://www.reddit.com/u/gtltc" target="_blank" rel="noopener noreferrer" class="hover:opacity-80 transition-opacity" aria-label="Join us on Reddit">
<svg class="w-5 h-5 fill-current text-gray-300 hover:text-brand-gold transition-colors" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<path d="M440.3 203.5c-15 0-28.8 6.2-38.8 16.2-37.1-25.4-86.1-41.9-140.3-43.4l29.7-93.9 80 18.9c0 22.6 18.3 41 40.9 41 22.6 0 40.9-18.4 40.9-40.9 0-22.6-18.3-40.9-40.9-40.9-16.1 0-30 9.4-36.6 22.9l-88.6-20.9c-6.2-1.5-12.6 2.1-14.6 8.1l-33.8 106.8c-55.2 1-105.1 17.5-142.8 43.3-9.9-9.8-23.4-15.8-38.2-15.8-30.3 0-54.9 24.6-54.9 54.9 0 22.2 13.2 41.4 32.2 50.1-1 5.2-1.5 10.5-1.5 15.9 0 78.3 91.1 141.8 203.3 141.8 112.3 0 203.3-63.5 203.3-141.8 0-5.2-.5-10.4-1.4-15.4 19.4-8.6 33-28 33-50.6 0-30.3-24.5-54.9-54.8-54.9zM129.5 287.8c0-22.6 18.3-40.9 40.9-40.9 22.6 0 40.9 18.3 40.9 40.9 0 22.6-18.3 40.9-40.9 40.9-22.6 0-40.9-18.3-40.9-40.9zm225.7 93.5c-21.4 21.3-62.5 31.7-99.2 31.7-36.7 0-77.8-10.4-99.2-31.7-4.7-4.7-4.7-12.3 0-17 4.7-4.7 12.3-4.7 17 0 14.9 14.9 48.2 24.7 82.2 24.7 34 0 67.3-9.8 82.2-24.7 4.7-4.7 12.3-4.7 17 0 4.7 4.7 4.7 12.3 0 17zm-13.6-52.6c-22.6 0-40.9-18.3-40.9-40.9 0-22.6 18.3-40.9 40.9-40.9 22.6 0 40.9 18.3 40.9 40.9 0 22.6-.631 40.9-40.9 40.9z"></path>
</svg>
</a>
</div>
</div>
</div>
</footer>
</body>
</html>