danielrosehill commited on
Commit
323ad41
Β·
1 Parent(s): 948605a
Files changed (6) hide show
  1. README.md +65 -28
  2. index.html +1 -1
  3. parse_markdown.py +19 -6
  4. projects.json +106 -53
  5. script.js +3 -2
  6. style.css +9 -0
README.md CHANGED
@@ -1,6 +1,6 @@
1
  ---
2
  title: Awesome Whisper Apps Browser
3
- emoji: πŸŽ™οΈ
4
  colorFrom: purple
5
  colorTo: blue
6
  sdk: static
@@ -9,64 +9,101 @@ pinned: false
9
 
10
  # Awesome Whisper Apps Browser
11
 
12
- An interactive browser for discovering applications, tools, and resources built with [OpenAI Whisper](https://github.com/openai/whisper) - a robust automatic speech recognition (ASR) system.
 
 
 
 
13
 
14
  ## Features
15
 
16
- - **Browse by Platform**: Filter projects by Linux, macOS, Windows, Android, iOS, Cross-Platform, and Web
17
- - **Browse by Use Case**: Find projects for Voice Typing, Subtitles & Captioning, Meetings & Productivity, Real-Time Transcription, Developer Tools, and Model Variants
18
- - **Search**: Quickly find projects by name or description
19
- - **Sort**: Organize projects by name, platform, or use case
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
  ## Data Source
22
 
23
- The project data is sourced from the `projects.md` awesome list and automatically parsed into a structured JSON format using `parse_markdown.py`.
24
 
25
- To update the projects database:
 
 
26
 
27
  ```bash
28
  python parse_markdown.py
29
  ```
30
 
31
- This will regenerate `projects.json` from the latest `projects.md` content.
32
 
33
  ## Project Structure
34
 
35
  ```
36
  .
37
- β”œβ”€β”€ index.html # Main HTML interface
38
- β”œβ”€β”€ style.css # Styles for the application
39
- β”œβ”€β”€ script.js # JavaScript for filtering and display
40
- β”œβ”€β”€ projects.md # Source data (awesome list format)
41
- β”œβ”€β”€ projects.json # Parsed project data
42
- β”œβ”€β”€ parse_markdown.py # Script to convert MD to JSON
43
- └── README.md # This file
44
  ```
45
 
46
- ## Development
 
 
47
 
48
- The Space uses a static HTML/CSS/JavaScript approach:
 
 
49
 
50
- 1. **Data Layer**: `projects.md` serves as the single source of truth
51
- 2. **Parser**: `parse_markdown.py` extracts structured data
52
- 3. **Frontend**: Vanilla JavaScript loads and filters the JSON data
53
 
54
  ## About Whisper
55
 
56
- Whisper is OpenAI's robust automatic speech recognition system trained on 680,000 hours of multilingual and multitask supervised data.
57
 
 
58
  - [Official Repository](https://github.com/openai/whisper)
59
  - [Research Paper](https://arxiv.org/abs/2212.04356)
60
- - [Hugging Face Models](https://huggingface.co/collections/openai/whisper-release)
61
 
62
  ## Contributing
63
 
64
- To add new projects:
65
 
66
- 1. Edit `projects.md` following the existing format
67
- 2. Run `python parse_markdown.py` to regenerate the JSON
68
- 3. Commit both `projects.md` and `projects.json`
 
 
69
 
70
  ## License
71
 
72
- This project browser is created to showcase the Awesome Whisper Apps collection. Individual projects have their own licenses.
 
 
 
 
 
 
 
 
 
1
  ---
2
  title: Awesome Whisper Apps Browser
3
+ emoji:
4
  colorFrom: purple
5
  colorTo: blue
6
  sdk: static
 
9
 
10
  # Awesome Whisper Apps Browser
11
 
12
+ An interactive browser for discovering applications, tools, and resources built with [OpenAI Whisper](https://github.com/openai/whisper), a robust automatic speech recognition (ASR) system.
13
+
14
+ ## Overview
15
+
16
+ This Space provides a curated, searchable directory of projects leveraging OpenAI's Whisper model for speech recognition, transcription, and related tasks. The interface allows users to explore projects by platform compatibility, use case category, or through direct search.
17
 
18
  ## Features
19
 
20
+ ### Browse by Platform
21
+ Filter projects by target platform:
22
+ - Linux
23
+ - macOS
24
+ - Windows
25
+ - Android
26
+ - iOS
27
+ - Cross-Platform
28
+ - Web
29
+
30
+ ### Browse by Use Case
31
+ Discover projects organized by functionality:
32
+ - Voice Typing
33
+ - Subtitles and Captioning
34
+ - Meetings and Productivity
35
+ - Real-Time Transcription
36
+ - Developer Tools
37
+ - Model Variants
38
+
39
+ ### Search and Sort
40
+ - **Search**: Quickly find projects by name or description keywords
41
+ - **Sort**: Organize results by name, platform, or use case for easier navigation
42
 
43
  ## Data Source
44
 
45
+ The project database is maintained in `projects.md` as an awesome list and automatically converted to structured JSON format for the web interface.
46
 
47
+ ### Updating the Database
48
+
49
+ To regenerate the projects database from the source markdown:
50
 
51
  ```bash
52
  python parse_markdown.py
53
  ```
54
 
55
+ This script parses `projects.md` and outputs `projects.json`, which powers the interactive browser.
56
 
57
  ## Project Structure
58
 
59
  ```
60
  .
61
+ β”œβ”€β”€ index.html # Main application interface
62
+ β”œβ”€β”€ style.css # Stylesheet for the browser
63
+ β”œβ”€β”€ script.js # Client-side filtering and display logic
64
+ β”œβ”€β”€ projects.md # Source data in markdown format
65
+ β”œβ”€β”€ projects.json # Parsed, structured project data
66
+ β”œβ”€β”€ parse_markdown.py # Markdown-to-JSON conversion script
67
+ └── README.md # Documentation
68
  ```
69
 
70
+ ## Technical Architecture
71
+
72
+ This Space implements a lightweight static architecture:
73
 
74
+ 1. **Data Layer**: `projects.md` serves as the authoritative source of project information
75
+ 2. **Build Process**: `parse_markdown.py` extracts and structures data into JSON
76
+ 3. **Frontend**: Vanilla JavaScript handles data loading, filtering, and dynamic display
77
 
78
+ No server-side processing or external dependencies are required at runtime.
 
 
79
 
80
  ## About Whisper
81
 
82
+ Whisper is OpenAI's state-of-the-art automatic speech recognition system, trained on 680,000 hours of multilingual and multitask supervised data. It demonstrates robust performance across diverse audio conditions and languages.
83
 
84
+ **Key Resources:**
85
  - [Official Repository](https://github.com/openai/whisper)
86
  - [Research Paper](https://arxiv.org/abs/2212.04356)
87
+ - [Hugging Face Model Collection](https://huggingface.co/collections/openai/whisper-release)
88
 
89
  ## Contributing
90
 
91
+ Contributions are welcome. To add new projects to the collection:
92
 
93
+ 1. Edit `projects.md` following the established markdown format
94
+ 2. Run `python parse_markdown.py` to regenerate `projects.json`
95
+ 3. Submit changes including both updated `projects.md` and regenerated `projects.json`
96
+
97
+ Ensure project descriptions are accurate and links are current.
98
 
99
  ## License
100
 
101
+ This project browser is created to showcase the Awesome Whisper Apps collection. Individual projects listed maintain their own respective licenses.
102
+
103
+ ## Created By
104
+
105
+ **Daniel Rosehill**
106
+
107
+ - Website: [danielrosehill.com](https://danielrosehill.com)
108
+ - GitHub: [github.com/danielrosehill](https://github.com/danielrosehill)
109
+ - Hugging Face: [huggingface.co/danielrosehill](https://huggingface.co/danielrosehill)
index.html CHANGED
@@ -9,7 +9,7 @@
9
  <body>
10
  <header>
11
  <div class="container">
12
- <h1>πŸŽ™οΈ Awesome Whisper Apps</h1>
13
  <p class="subtitle">A curated collection of applications built with OpenAI Whisper for speech recognition</p>
14
  </div>
15
  </header>
 
9
  <body>
10
  <header>
11
  <div class="container">
12
+ <h1>Awesome Whisper Apps</h1>
13
  <p class="subtitle">A curated collection of applications built with OpenAI Whisper for speech recognition</p>
14
  </div>
15
  </header>
parse_markdown.py CHANGED
@@ -20,8 +20,9 @@ def extract_github_repo(url):
20
  def parse_table_row(line, context):
21
  """Parse a markdown table row."""
22
  # Table format: | [Name](url) | stars_badge | Description |
 
23
  parts = [p.strip() for p in line.split('|')[1:-1]] # Remove empty first/last
24
- if len(parts) < 3:
25
  return None
26
 
27
  # Extract name and URL from first column
@@ -31,7 +32,14 @@ def parse_table_row(line, context):
31
 
32
  name = match.group(1)
33
  url = match.group(2)
34
- description = parts[2] if len(parts) > 2 else ""
 
 
 
 
 
 
 
35
 
36
  return {
37
  'name': name,
@@ -39,7 +47,8 @@ def parse_table_row(line, context):
39
  'description': description,
40
  'platforms': context.get('platforms', []),
41
  'usecases': context.get('usecases', []),
42
- 'github_repo': extract_github_repo(url)
 
43
  }
44
 
45
 
@@ -55,6 +64,7 @@ def parse_bullet_item(line, context):
55
  name = match.group(1)
56
  url = match.group(2)
57
  description = match.group(3).strip()
 
58
 
59
  return {
60
  'name': name,
@@ -62,7 +72,8 @@ def parse_bullet_item(line, context):
62
  'description': description,
63
  'platforms': context.get('platforms', []),
64
  'usecases': context.get('usecases', []),
65
- 'github_repo': extract_github_repo(url)
 
66
  }
67
 
68
 
@@ -188,6 +199,7 @@ def parse_markdown(md_path):
188
  name = match.group(1)
189
  url = match.group(2)
190
  description = match.group(3).strip()
 
191
 
192
  project = {
193
  'name': name,
@@ -195,7 +207,8 @@ def parse_markdown(md_path):
195
  'description': description,
196
  'platforms': current_context.get('platforms', ['web']),
197
  'usecases': current_context.get('usecases', ['saas']),
198
- 'github_repo': extract_github_repo(url)
 
199
  }
200
 
201
  if not any(p['name'] == project['name'] for p in projects):
@@ -258,7 +271,7 @@ def main():
258
  with open(json_path, 'w', encoding='utf-8') as f:
259
  json.dump(projects, f, indent=2, ensure_ascii=False)
260
 
261
- print(f"βœ“ Created {json_path} with {len(projects)} projects")
262
 
263
  # Print statistics
264
  platforms = set()
 
20
  def parse_table_row(line, context):
21
  """Parse a markdown table row."""
22
  # Table format: | [Name](url) | stars_badge | Description |
23
+ # or: | [Name](url) | Platform | stars_badge | Description |
24
  parts = [p.strip() for p in line.split('|')[1:-1]] # Remove empty first/last
25
+ if len(parts) < 2:
26
  return None
27
 
28
  # Extract name and URL from first column
 
32
 
33
  name = match.group(1)
34
  url = match.group(2)
35
+ github_repo = extract_github_repo(url)
36
+
37
+ # Find the description (last column that doesn't contain an image badge)
38
+ description = ""
39
+ for i in range(len(parts) - 1, 0, -1):
40
+ if '![' not in parts[i]:
41
+ description = parts[i]
42
+ break
43
 
44
  return {
45
  'name': name,
 
47
  'description': description,
48
  'platforms': context.get('platforms', []),
49
  'usecases': context.get('usecases', []),
50
+ 'github_repo': github_repo,
51
+ 'has_stars': github_repo is not None
52
  }
53
 
54
 
 
64
  name = match.group(1)
65
  url = match.group(2)
66
  description = match.group(3).strip()
67
+ github_repo = extract_github_repo(url)
68
 
69
  return {
70
  'name': name,
 
72
  'description': description,
73
  'platforms': context.get('platforms', []),
74
  'usecases': context.get('usecases', []),
75
+ 'github_repo': github_repo,
76
+ 'has_stars': github_repo is not None
77
  }
78
 
79
 
 
199
  name = match.group(1)
200
  url = match.group(2)
201
  description = match.group(3).strip()
202
+ github_repo = extract_github_repo(url)
203
 
204
  project = {
205
  'name': name,
 
207
  'description': description,
208
  'platforms': current_context.get('platforms', ['web']),
209
  'usecases': current_context.get('usecases', ['saas']),
210
+ 'github_repo': github_repo,
211
+ 'has_stars': github_repo is not None
212
  }
213
 
214
  if not any(p['name'] == project['name'] for p in projects):
 
271
  with open(json_path, 'w', encoding='utf-8') as f:
272
  json.dump(projects, f, indent=2, ensure_ascii=False)
273
 
274
+ print(f"Created {json_path} with {len(projects)} projects")
275
 
276
  # Print statistics
277
  platforms = set()
projects.json CHANGED
@@ -9,7 +9,8 @@
9
  "usecases": [
10
  "developer"
11
  ],
12
- "github_repo": "chidiwilliams/buzz"
 
13
  },
14
  {
15
  "name": "whisper-writer",
@@ -21,7 +22,8 @@
21
  "usecases": [
22
  "voice-typing"
23
  ],
24
- "github_repo": "savbell/whisper-writer"
 
25
  },
26
  {
27
  "name": "faster-whisper-GUI",
@@ -33,7 +35,8 @@
33
  "usecases": [
34
  "model-variants"
35
  ],
36
- "github_repo": "CheshireCC/faster-whisper-GUI"
 
37
  },
38
  {
39
  "name": "SoftWhisper",
@@ -45,7 +48,8 @@
45
  "usecases": [
46
  "developer"
47
  ],
48
- "github_repo": "NullMagic2/SoftWhisper"
 
49
  },
50
  {
51
  "name": "speech-assistant",
@@ -57,7 +61,8 @@
57
  "usecases": [
58
  "developer"
59
  ],
60
- "github_repo": "Mohamad-Hussein/speech-assistant"
 
61
  },
62
  {
63
  "name": "whisper-dictation",
@@ -69,7 +74,8 @@
69
  "usecases": [
70
  "voice-typing"
71
  ],
72
- "github_repo": "foges/whisper-dictation"
 
73
  },
74
  {
75
  "name": "whisper-realtime-gui",
@@ -81,7 +87,8 @@
81
  "usecases": [
82
  "real-time"
83
  ],
84
- "github_repo": "phongthanhbuiit/whisper-realtime-gui"
 
85
  },
86
  {
87
  "name": "whisper-ui",
@@ -93,7 +100,8 @@
93
  "usecases": [
94
  "developer"
95
  ],
96
- "github_repo": "schnoddelbotz/whisper-ui"
 
97
  },
98
  {
99
  "name": "whisper_dictation",
@@ -105,7 +113,8 @@
105
  "usecases": [
106
  "voice-typing"
107
  ],
108
- "github_repo": "themanyone/whisper_dictation"
 
109
  },
110
  {
111
  "name": "WhisperGUI",
@@ -117,7 +126,8 @@
117
  "usecases": [
118
  "developer"
119
  ],
120
- "github_repo": "ADT109119/WhisperGUI"
 
121
  },
122
  {
123
  "name": "froshine",
@@ -129,7 +139,8 @@
129
  "usecases": [
130
  "developer"
131
  ],
132
- "github_repo": "AdrianScott/froshine"
 
133
  },
134
  {
135
  "name": "speak-to-ai",
@@ -141,7 +152,8 @@
141
  "usecases": [
142
  "voice-typing"
143
  ],
144
- "github_repo": "AshBuk/speak-to-ai"
 
145
  },
146
  {
147
  "name": "Whisper-Notepad-For-Linux",
@@ -153,7 +165,8 @@
153
  "usecases": [
154
  "meetings"
155
  ],
156
- "github_repo": "danielrosehill/Whisper-Notepad-For-Linux"
 
157
  },
158
  {
159
  "name": "WhisperNow",
@@ -165,7 +178,8 @@
165
  "usecases": [
166
  "model-variants"
167
  ],
168
- "github_repo": "shinglyu/WhisperNow"
 
169
  },
170
  {
171
  "name": "whisper.cpp-cli",
@@ -177,7 +191,8 @@
177
  "usecases": [
178
  "model-variants"
179
  ],
180
- "github_repo": "charliermarsh/whisper.cpp-cli"
 
181
  },
182
  {
183
  "name": "blurt",
@@ -189,7 +204,8 @@
189
  "usecases": [
190
  "developer"
191
  ],
192
- "github_repo": "QuantiusBenignus/blurt"
 
193
  },
194
  {
195
  "name": "nerd-dictation",
@@ -201,7 +217,8 @@
201
  "usecases": [
202
  "voice-typing"
203
  ],
204
- "github_repo": "ideasman42/nerd-dictation"
 
205
  },
206
  {
207
  "name": "BlahST",
@@ -213,7 +230,8 @@
213
  "usecases": [
214
  "developer"
215
  ],
216
- "github_repo": "QuantiusBenignus/BlahST"
 
217
  },
218
  {
219
  "name": "Linux-Dictation-Project",
@@ -225,7 +243,8 @@
225
  "usecases": [
226
  "voice-typing"
227
  ],
228
- "github_repo": "wheeler01/Linux-Dictation-Project"
 
229
  },
230
  {
231
  "name": "linux-stt-input",
@@ -237,7 +256,8 @@
237
  "usecases": [
238
  "developer"
239
  ],
240
- "github_repo": "fengwk/linux-stt-input"
 
241
  },
242
  {
243
  "name": "linux-voice-to-text-ai",
@@ -249,7 +269,8 @@
249
  "usecases": [
250
  "voice-typing"
251
  ],
252
- "github_repo": "trebormc/linux-voice-to-text-ai"
 
253
  },
254
  {
255
  "name": "LinuxWhisper",
@@ -261,7 +282,8 @@
261
  "usecases": [
262
  "model-variants"
263
  ],
264
- "github_repo": "vitali87/LinuxWhisper"
 
265
  },
266
  {
267
  "name": "voice-typing-linux",
@@ -273,7 +295,8 @@
273
  "usecases": [
274
  "voice-typing"
275
  ],
276
- "github_repo": "GitJuhb/voice-typing-linux"
 
277
  },
278
  {
279
  "name": "Whisper-Dictation",
@@ -285,7 +308,8 @@
285
  "usecases": [
286
  "voice-typing"
287
  ],
288
- "github_repo": "LumenYoung/Whisper-Dictation"
 
289
  },
290
  {
291
  "name": "whisper-flow-linux",
@@ -297,7 +321,8 @@
297
  "usecases": [
298
  "model-variants"
299
  ],
300
- "github_repo": "sapountzis/whisper-flow-linux"
 
301
  },
302
  {
303
  "name": "whisper-hotkey-linux",
@@ -309,7 +334,8 @@
309
  "usecases": [
310
  "model-variants"
311
  ],
312
- "github_repo": "atkvishnu/whisper-hotkey-linux"
 
313
  },
314
  {
315
  "name": "whispertrigger",
@@ -321,7 +347,8 @@
321
  "usecases": [
322
  "model-variants"
323
  ],
324
- "github_repo": "RetroTrigger/whispertrigger"
 
325
  },
326
  {
327
  "name": "whisprd",
@@ -333,7 +360,8 @@
333
  "usecases": [
334
  "model-variants"
335
  ],
336
- "github_repo": "AgenticToaster/whisprd"
 
337
  },
338
  {
339
  "name": "whisper-to-input",
@@ -345,7 +373,8 @@
345
  "usecases": [
346
  "model-variants"
347
  ],
348
- "github_repo": "j3soon/whisper-to-input"
 
349
  },
350
  {
351
  "name": "whispy",
@@ -357,7 +386,8 @@
357
  "usecases": [
358
  "developer"
359
  ],
360
- "github_repo": "daaku/whispy"
 
361
  },
362
  {
363
  "name": "dicti",
@@ -369,7 +399,8 @@
369
  "usecases": [
370
  "voice-typing"
371
  ],
372
- "github_repo": "tksimson/dicti"
 
373
  },
374
  {
375
  "name": "sonori",
@@ -381,7 +412,8 @@
381
  "usecases": [
382
  "voice-typing"
383
  ],
384
- "github_repo": "0xPD33/sonori"
 
385
  },
386
  {
387
  "name": "hushnote",
@@ -393,7 +425,8 @@
393
  "usecases": [
394
  "meetings"
395
  ],
396
- "github_repo": "peteonrails/hushnote"
 
397
  },
398
  {
399
  "name": "Local-Voice",
@@ -405,7 +438,8 @@
405
  "usecases": [
406
  "voice-typing"
407
  ],
408
- "github_repo": "shashank2122/Local-Voice"
 
409
  },
410
  {
411
  "name": "s2t",
@@ -417,7 +451,8 @@
417
  "usecases": [
418
  "developer"
419
  ],
420
- "github_repo": "franchesoni/s2t"
 
421
  },
422
  {
423
  "name": "Whisper-Notepad-Simple",
@@ -429,7 +464,8 @@
429
  "usecases": [
430
  "meetings"
431
  ],
432
- "github_repo": "danielrosehill/Whisper-Notepad-Simple"
 
433
  },
434
  {
435
  "name": "Linux-AI-Assistant-scripts",
@@ -441,7 +477,8 @@
441
  "usecases": [
442
  "developer"
443
  ],
444
- "github_repo": "samoylenkodmitry/Linux-AI-Assistant-scripts"
 
445
  },
446
  {
447
  "name": "SuperWhisper",
@@ -453,7 +490,8 @@
453
  "usecases": [
454
  "voice-typing"
455
  ],
456
- "github_repo": null
 
457
  },
458
  {
459
  "name": "OpenSuperWhisper",
@@ -465,7 +503,8 @@
465
  "usecases": [
466
  "model-variants"
467
  ],
468
- "github_repo": "Starmel/OpenSuperWhisper"
 
469
  },
470
  {
471
  "name": "WhisperKit",
@@ -477,7 +516,8 @@
477
  "usecases": [
478
  "model-variants"
479
  ],
480
- "github_repo": "argmaxinc/WhisperKit"
 
481
  },
482
  {
483
  "name": "Careless Whisper",
@@ -489,7 +529,8 @@
489
  "usecases": [
490
  "developer"
491
  ],
492
- "github_repo": null
 
493
  },
494
  {
495
  "name": "ollama-voice-mac",
@@ -501,7 +542,8 @@
501
  "usecases": [
502
  "voice-typing"
503
  ],
504
- "github_repo": "apeatling/ollama-voice-mac"
 
505
  },
506
  {
507
  "name": "whisperanywhere-js",
@@ -513,7 +555,8 @@
513
  "usecases": [
514
  "model-variants"
515
  ],
516
- "github_repo": "unclecode/whisperanywhere-js"
 
517
  },
518
  {
519
  "name": "AI Transcription",
@@ -525,7 +568,8 @@
525
  "usecases": [
526
  "developer"
527
  ],
528
- "github_repo": null
 
529
  },
530
  {
531
  "name": "Whisper Typing for Windows",
@@ -537,7 +581,8 @@
537
  "usecases": [
538
  "voice-typing"
539
  ],
540
- "github_repo": null
 
541
  },
542
  {
543
  "name": "WinWhisper",
@@ -549,7 +594,8 @@
549
  "usecases": [
550
  "model-variants"
551
  ],
552
- "github_repo": "GewoonJaap/WinWhisper"
 
553
  },
554
  {
555
  "name": "whisperIME",
@@ -561,7 +607,8 @@
561
  "usecases": [
562
  "model-variants"
563
  ],
564
- "github_repo": "woheller69/whisperIME"
 
565
  },
566
  {
567
  "name": "WhisperInput",
@@ -573,7 +620,8 @@
573
  "usecases": [
574
  "model-variants"
575
  ],
576
- "github_repo": "alex-vt/WhisperInput"
 
577
  },
578
  {
579
  "name": "WhisperKitAndroid",
@@ -585,7 +633,8 @@
585
  "usecases": [
586
  "model-variants"
587
  ],
588
- "github_repo": "argmaxinc/WhisperKitAndroid"
 
589
  },
590
  {
591
  "name": "RTranslator",
@@ -597,7 +646,8 @@
597
  "usecases": [
598
  "real-time"
599
  ],
600
- "github_repo": "niedev/RTranslator"
 
601
  },
602
  {
603
  "name": "Dictate",
@@ -609,7 +659,8 @@
609
  "usecases": [
610
  "voice-typing"
611
  ],
612
- "github_repo": "DevEmperor/Dictate"
 
613
  },
614
  {
615
  "name": "whisper_android",
@@ -621,7 +672,8 @@
621
  "usecases": [
622
  "model-variants"
623
  ],
624
- "github_repo": "vilassn/whisper_android"
 
625
  },
626
  {
627
  "name": "Whisperboard",
@@ -633,6 +685,7 @@
633
  "usecases": [
634
  "model-variants"
635
  ],
636
- "github_repo": "Saik0s/Whisperboard"
 
637
  }
638
  ]
 
9
  "usecases": [
10
  "developer"
11
  ],
12
+ "github_repo": "chidiwilliams/buzz",
13
+ "has_stars": true
14
  },
15
  {
16
  "name": "whisper-writer",
 
22
  "usecases": [
23
  "voice-typing"
24
  ],
25
+ "github_repo": "savbell/whisper-writer",
26
+ "has_stars": true
27
  },
28
  {
29
  "name": "faster-whisper-GUI",
 
35
  "usecases": [
36
  "model-variants"
37
  ],
38
+ "github_repo": "CheshireCC/faster-whisper-GUI",
39
+ "has_stars": true
40
  },
41
  {
42
  "name": "SoftWhisper",
 
48
  "usecases": [
49
  "developer"
50
  ],
51
+ "github_repo": "NullMagic2/SoftWhisper",
52
+ "has_stars": true
53
  },
54
  {
55
  "name": "speech-assistant",
 
61
  "usecases": [
62
  "developer"
63
  ],
64
+ "github_repo": "Mohamad-Hussein/speech-assistant",
65
+ "has_stars": true
66
  },
67
  {
68
  "name": "whisper-dictation",
 
74
  "usecases": [
75
  "voice-typing"
76
  ],
77
+ "github_repo": "foges/whisper-dictation",
78
+ "has_stars": true
79
  },
80
  {
81
  "name": "whisper-realtime-gui",
 
87
  "usecases": [
88
  "real-time"
89
  ],
90
+ "github_repo": "phongthanhbuiit/whisper-realtime-gui",
91
+ "has_stars": true
92
  },
93
  {
94
  "name": "whisper-ui",
 
100
  "usecases": [
101
  "developer"
102
  ],
103
+ "github_repo": "schnoddelbotz/whisper-ui",
104
+ "has_stars": true
105
  },
106
  {
107
  "name": "whisper_dictation",
 
113
  "usecases": [
114
  "voice-typing"
115
  ],
116
+ "github_repo": "themanyone/whisper_dictation",
117
+ "has_stars": true
118
  },
119
  {
120
  "name": "WhisperGUI",
 
126
  "usecases": [
127
  "developer"
128
  ],
129
+ "github_repo": "ADT109119/WhisperGUI",
130
+ "has_stars": true
131
  },
132
  {
133
  "name": "froshine",
 
139
  "usecases": [
140
  "developer"
141
  ],
142
+ "github_repo": "AdrianScott/froshine",
143
+ "has_stars": true
144
  },
145
  {
146
  "name": "speak-to-ai",
 
152
  "usecases": [
153
  "voice-typing"
154
  ],
155
+ "github_repo": "AshBuk/speak-to-ai",
156
+ "has_stars": true
157
  },
158
  {
159
  "name": "Whisper-Notepad-For-Linux",
 
165
  "usecases": [
166
  "meetings"
167
  ],
168
+ "github_repo": "danielrosehill/Whisper-Notepad-For-Linux",
169
+ "has_stars": true
170
  },
171
  {
172
  "name": "WhisperNow",
 
178
  "usecases": [
179
  "model-variants"
180
  ],
181
+ "github_repo": "shinglyu/WhisperNow",
182
+ "has_stars": true
183
  },
184
  {
185
  "name": "whisper.cpp-cli",
 
191
  "usecases": [
192
  "model-variants"
193
  ],
194
+ "github_repo": "charliermarsh/whisper.cpp-cli",
195
+ "has_stars": true
196
  },
197
  {
198
  "name": "blurt",
 
204
  "usecases": [
205
  "developer"
206
  ],
207
+ "github_repo": "QuantiusBenignus/blurt",
208
+ "has_stars": true
209
  },
210
  {
211
  "name": "nerd-dictation",
 
217
  "usecases": [
218
  "voice-typing"
219
  ],
220
+ "github_repo": "ideasman42/nerd-dictation",
221
+ "has_stars": true
222
  },
223
  {
224
  "name": "BlahST",
 
230
  "usecases": [
231
  "developer"
232
  ],
233
+ "github_repo": "QuantiusBenignus/BlahST",
234
+ "has_stars": true
235
  },
236
  {
237
  "name": "Linux-Dictation-Project",
 
243
  "usecases": [
244
  "voice-typing"
245
  ],
246
+ "github_repo": "wheeler01/Linux-Dictation-Project",
247
+ "has_stars": true
248
  },
249
  {
250
  "name": "linux-stt-input",
 
256
  "usecases": [
257
  "developer"
258
  ],
259
+ "github_repo": "fengwk/linux-stt-input",
260
+ "has_stars": true
261
  },
262
  {
263
  "name": "linux-voice-to-text-ai",
 
269
  "usecases": [
270
  "voice-typing"
271
  ],
272
+ "github_repo": "trebormc/linux-voice-to-text-ai",
273
+ "has_stars": true
274
  },
275
  {
276
  "name": "LinuxWhisper",
 
282
  "usecases": [
283
  "model-variants"
284
  ],
285
+ "github_repo": "vitali87/LinuxWhisper",
286
+ "has_stars": true
287
  },
288
  {
289
  "name": "voice-typing-linux",
 
295
  "usecases": [
296
  "voice-typing"
297
  ],
298
+ "github_repo": "GitJuhb/voice-typing-linux",
299
+ "has_stars": true
300
  },
301
  {
302
  "name": "Whisper-Dictation",
 
308
  "usecases": [
309
  "voice-typing"
310
  ],
311
+ "github_repo": "LumenYoung/Whisper-Dictation",
312
+ "has_stars": true
313
  },
314
  {
315
  "name": "whisper-flow-linux",
 
321
  "usecases": [
322
  "model-variants"
323
  ],
324
+ "github_repo": "sapountzis/whisper-flow-linux",
325
+ "has_stars": true
326
  },
327
  {
328
  "name": "whisper-hotkey-linux",
 
334
  "usecases": [
335
  "model-variants"
336
  ],
337
+ "github_repo": "atkvishnu/whisper-hotkey-linux",
338
+ "has_stars": true
339
  },
340
  {
341
  "name": "whispertrigger",
 
347
  "usecases": [
348
  "model-variants"
349
  ],
350
+ "github_repo": "RetroTrigger/whispertrigger",
351
+ "has_stars": true
352
  },
353
  {
354
  "name": "whisprd",
 
360
  "usecases": [
361
  "model-variants"
362
  ],
363
+ "github_repo": "AgenticToaster/whisprd",
364
+ "has_stars": true
365
  },
366
  {
367
  "name": "whisper-to-input",
 
373
  "usecases": [
374
  "model-variants"
375
  ],
376
+ "github_repo": "j3soon/whisper-to-input",
377
+ "has_stars": true
378
  },
379
  {
380
  "name": "whispy",
 
386
  "usecases": [
387
  "developer"
388
  ],
389
+ "github_repo": "daaku/whispy",
390
+ "has_stars": true
391
  },
392
  {
393
  "name": "dicti",
 
399
  "usecases": [
400
  "voice-typing"
401
  ],
402
+ "github_repo": "tksimson/dicti",
403
+ "has_stars": true
404
  },
405
  {
406
  "name": "sonori",
 
412
  "usecases": [
413
  "voice-typing"
414
  ],
415
+ "github_repo": "0xPD33/sonori",
416
+ "has_stars": true
417
  },
418
  {
419
  "name": "hushnote",
 
425
  "usecases": [
426
  "meetings"
427
  ],
428
+ "github_repo": "peteonrails/hushnote",
429
+ "has_stars": true
430
  },
431
  {
432
  "name": "Local-Voice",
 
438
  "usecases": [
439
  "voice-typing"
440
  ],
441
+ "github_repo": "shashank2122/Local-Voice",
442
+ "has_stars": true
443
  },
444
  {
445
  "name": "s2t",
 
451
  "usecases": [
452
  "developer"
453
  ],
454
+ "github_repo": "franchesoni/s2t",
455
+ "has_stars": true
456
  },
457
  {
458
  "name": "Whisper-Notepad-Simple",
 
464
  "usecases": [
465
  "meetings"
466
  ],
467
+ "github_repo": "danielrosehill/Whisper-Notepad-Simple",
468
+ "has_stars": true
469
  },
470
  {
471
  "name": "Linux-AI-Assistant-scripts",
 
477
  "usecases": [
478
  "developer"
479
  ],
480
+ "github_repo": "samoylenkodmitry/Linux-AI-Assistant-scripts",
481
+ "has_stars": true
482
  },
483
  {
484
  "name": "SuperWhisper",
 
490
  "usecases": [
491
  "voice-typing"
492
  ],
493
+ "github_repo": null,
494
+ "has_stars": false
495
  },
496
  {
497
  "name": "OpenSuperWhisper",
 
503
  "usecases": [
504
  "model-variants"
505
  ],
506
+ "github_repo": "Starmel/OpenSuperWhisper",
507
+ "has_stars": true
508
  },
509
  {
510
  "name": "WhisperKit",
 
516
  "usecases": [
517
  "model-variants"
518
  ],
519
+ "github_repo": "argmaxinc/WhisperKit",
520
+ "has_stars": true
521
  },
522
  {
523
  "name": "Careless Whisper",
 
529
  "usecases": [
530
  "developer"
531
  ],
532
+ "github_repo": null,
533
+ "has_stars": false
534
  },
535
  {
536
  "name": "ollama-voice-mac",
 
542
  "usecases": [
543
  "voice-typing"
544
  ],
545
+ "github_repo": "apeatling/ollama-voice-mac",
546
+ "has_stars": true
547
  },
548
  {
549
  "name": "whisperanywhere-js",
 
555
  "usecases": [
556
  "model-variants"
557
  ],
558
+ "github_repo": "unclecode/whisperanywhere-js",
559
+ "has_stars": true
560
  },
561
  {
562
  "name": "AI Transcription",
 
568
  "usecases": [
569
  "developer"
570
  ],
571
+ "github_repo": null,
572
+ "has_stars": false
573
  },
574
  {
575
  "name": "Whisper Typing for Windows",
 
581
  "usecases": [
582
  "voice-typing"
583
  ],
584
+ "github_repo": null,
585
+ "has_stars": false
586
  },
587
  {
588
  "name": "WinWhisper",
 
594
  "usecases": [
595
  "model-variants"
596
  ],
597
+ "github_repo": "GewoonJaap/WinWhisper",
598
+ "has_stars": true
599
  },
600
  {
601
  "name": "whisperIME",
 
607
  "usecases": [
608
  "model-variants"
609
  ],
610
+ "github_repo": "woheller69/whisperIME",
611
+ "has_stars": true
612
  },
613
  {
614
  "name": "WhisperInput",
 
620
  "usecases": [
621
  "model-variants"
622
  ],
623
+ "github_repo": "alex-vt/WhisperInput",
624
+ "has_stars": true
625
  },
626
  {
627
  "name": "WhisperKitAndroid",
 
633
  "usecases": [
634
  "model-variants"
635
  ],
636
+ "github_repo": "argmaxinc/WhisperKitAndroid",
637
+ "has_stars": true
638
  },
639
  {
640
  "name": "RTranslator",
 
646
  "usecases": [
647
  "real-time"
648
  ],
649
+ "github_repo": "niedev/RTranslator",
650
+ "has_stars": true
651
  },
652
  {
653
  "name": "Dictate",
 
659
  "usecases": [
660
  "voice-typing"
661
  ],
662
+ "github_repo": "DevEmperor/Dictate",
663
+ "has_stars": true
664
  },
665
  {
666
  "name": "whisper_android",
 
672
  "usecases": [
673
  "model-variants"
674
  ],
675
+ "github_repo": "vilassn/whisper_android",
676
+ "has_stars": true
677
  },
678
  {
679
  "name": "Whisperboard",
 
685
  "usecases": [
686
  "model-variants"
687
  ],
688
+ "github_repo": "Saik0s/Whisperboard",
689
+ "has_stars": true
690
  }
691
  ]
script.js CHANGED
@@ -99,14 +99,15 @@ function createProjectCard(project) {
99
  .map(u => `<span class="meta-tag usecase-tag">${formatTag(u)}</span>`)
100
  .join('');
101
 
102
- const githubLink = project.github_repo
103
- ? `<a href="https://github.com/${project.github_repo}" target="_blank" rel="noopener">GitHub οΏ½</a>`
104
  : '';
105
 
106
  return `
107
  <div class="project-card">
108
  <h3>
109
  <a href="${project.url}" target="_blank" rel="noopener">${escapeHtml(project.name)}</a>
 
110
  </h3>
111
  <p class="project-description">${escapeHtml(project.description)}</p>
112
  <div class="project-meta">
 
99
  .map(u => `<span class="meta-tag usecase-tag">${formatTag(u)}</span>`)
100
  .join('');
101
 
102
+ const starBadge = project.github_repo
103
+ ? `<img src="https://img.shields.io/github/stars/${project.github_repo}?style=flat-square" alt="GitHub stars" class="github-stars-badge">`
104
  : '';
105
 
106
  return `
107
  <div class="project-card">
108
  <h3>
109
  <a href="${project.url}" target="_blank" rel="noopener">${escapeHtml(project.name)}</a>
110
+ ${starBadge}
111
  </h3>
112
  <p class="project-description">${escapeHtml(project.description)}</p>
113
  <div class="project-meta">
style.css CHANGED
@@ -186,6 +186,10 @@ main {
186
  color: #2d3748;
187
  margin-bottom: 0.75rem;
188
  font-size: 1.2rem;
 
 
 
 
189
  }
190
 
191
  .project-card h3 a {
@@ -197,6 +201,11 @@ main {
197
  text-decoration: underline;
198
  }
199
 
 
 
 
 
 
200
  .project-description {
201
  color: #4a5568;
202
  margin-bottom: 1rem;
 
186
  color: #2d3748;
187
  margin-bottom: 0.75rem;
188
  font-size: 1.2rem;
189
+ display: flex;
190
+ align-items: center;
191
+ gap: 0.75rem;
192
+ flex-wrap: wrap;
193
  }
194
 
195
  .project-card h3 a {
 
201
  text-decoration: underline;
202
  }
203
 
204
+ .github-stars-badge {
205
+ height: 20px;
206
+ vertical-align: middle;
207
+ }
208
+
209
  .project-description {
210
  color: #4a5568;
211
  margin-bottom: 1rem;