groove-dev 0.27.14 → 0.27.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/README.md +37 -1
  2. package/developerID_application.cer +0 -0
  3. package/node_modules/@groove-dev/daemon/src/api.js +587 -68
  4. package/node_modules/@groove-dev/daemon/src/classifier.js +24 -0
  5. package/node_modules/@groove-dev/daemon/src/credentials.js +12 -2
  6. package/node_modules/@groove-dev/daemon/src/federation/ambassador.js +204 -0
  7. package/node_modules/@groove-dev/daemon/src/federation/connection.js +359 -0
  8. package/node_modules/@groove-dev/daemon/src/federation/contracts.js +112 -0
  9. package/node_modules/@groove-dev/daemon/src/federation/whitelist.js +190 -0
  10. package/node_modules/@groove-dev/daemon/src/federation.js +166 -7
  11. package/node_modules/@groove-dev/daemon/src/index.js +172 -19
  12. package/node_modules/@groove-dev/daemon/src/introducer.js +52 -7
  13. package/node_modules/@groove-dev/daemon/src/journalist.js +46 -1
  14. package/node_modules/@groove-dev/daemon/src/memory.js +36 -16
  15. package/node_modules/@groove-dev/daemon/src/process.js +140 -23
  16. package/node_modules/@groove-dev/daemon/src/providers/base.js +1 -0
  17. package/node_modules/@groove-dev/daemon/src/providers/claude-code.js +1 -0
  18. package/node_modules/@groove-dev/daemon/src/providers/codex.js +124 -28
  19. package/node_modules/@groove-dev/daemon/src/providers/gemini.js +104 -17
  20. package/node_modules/@groove-dev/daemon/src/providers/index.js +17 -0
  21. package/node_modules/@groove-dev/daemon/src/registry.js +10 -1
  22. package/node_modules/@groove-dev/daemon/src/rotator.js +93 -30
  23. package/node_modules/@groove-dev/daemon/src/skills.js +33 -3
  24. package/node_modules/@groove-dev/daemon/src/terminal-pty.js +9 -1
  25. package/node_modules/@groove-dev/daemon/src/tool-executor.js +11 -5
  26. package/node_modules/@groove-dev/daemon/src/toys.js +69 -0
  27. package/node_modules/@groove-dev/daemon/src/tunnel-manager.js +24 -5
  28. package/node_modules/@groove-dev/daemon/templates/toys-catalog.json +242 -0
  29. package/node_modules/@groove-dev/daemon/test/classifier.test.js +98 -0
  30. package/node_modules/@groove-dev/daemon/test/introducer.test.js +72 -1
  31. package/node_modules/@groove-dev/daemon/test/journalist.test.js +117 -0
  32. package/node_modules/@groove-dev/daemon/test/memory.test.js +37 -1
  33. package/node_modules/@groove-dev/daemon/test/rotator.test.js +183 -4
  34. package/node_modules/@groove-dev/gui/dist/assets/index-BglPgjlu.js +8607 -0
  35. package/node_modules/@groove-dev/gui/dist/assets/index-CGcwmmJv.css +1 -0
  36. package/node_modules/@groove-dev/gui/dist/index.html +3 -2
  37. package/node_modules/@groove-dev/gui/index.html +1 -0
  38. package/node_modules/@groove-dev/gui/src/app.css +7 -0
  39. package/node_modules/@groove-dev/gui/src/app.jsx +37 -10
  40. package/node_modules/@groove-dev/gui/src/components/agents/agent-chat.jsx +21 -31
  41. package/node_modules/@groove-dev/gui/src/components/agents/agent-config.jsx +11 -6
  42. package/node_modules/@groove-dev/gui/src/components/agents/agent-feed.jsx +2 -2
  43. package/node_modules/@groove-dev/gui/src/components/agents/spawn-wizard.jsx +42 -1
  44. package/node_modules/@groove-dev/gui/src/components/editor/breadcrumbs.jsx +30 -0
  45. package/node_modules/@groove-dev/gui/src/components/editor/code-editor.jsx +33 -2
  46. package/node_modules/@groove-dev/gui/src/components/editor/editor-status-bar.jsx +26 -0
  47. package/node_modules/@groove-dev/gui/src/components/editor/editor-tabs.jsx +113 -34
  48. package/node_modules/@groove-dev/gui/src/components/editor/goto-line.jsx +35 -0
  49. package/node_modules/@groove-dev/gui/src/components/editor/terminal.jsx +12 -6
  50. package/node_modules/@groove-dev/gui/src/components/layout/activity-bar.jsx +13 -3
  51. package/node_modules/@groove-dev/gui/src/components/layout/app-shell.jsx +0 -1
  52. package/node_modules/@groove-dev/gui/src/components/layout/breadcrumb-bar.jsx +165 -47
  53. package/node_modules/@groove-dev/gui/src/components/layout/command-palette.jsx +6 -2
  54. package/node_modules/@groove-dev/gui/src/components/layout/terminal-panel.jsx +10 -9
  55. package/node_modules/@groove-dev/gui/src/components/marketplace/repo-import.jsx +9 -1
  56. package/node_modules/@groove-dev/gui/src/components/onboarding/provider-card.jsx +134 -0
  57. package/node_modules/@groove-dev/gui/src/components/onboarding/setup-wizard.jsx +819 -0
  58. package/node_modules/@groove-dev/gui/src/components/pro/pro-gate.jsx +12 -5
  59. package/node_modules/@groove-dev/gui/src/components/pro/upgrade-card.jsx +15 -8
  60. package/node_modules/@groove-dev/gui/src/components/pro/upgrade-modal.jsx +151 -0
  61. package/node_modules/@groove-dev/gui/src/components/settings/federation-activity.jsx +98 -0
  62. package/node_modules/@groove-dev/gui/src/components/settings/federation-panel.jsx +290 -0
  63. package/node_modules/@groove-dev/gui/src/components/settings/federation-peers.jsx +126 -0
  64. package/node_modules/@groove-dev/gui/src/components/settings/federation-wizard.jsx +293 -0
  65. package/node_modules/@groove-dev/gui/src/components/settings/quick-connect.jsx +110 -67
  66. package/node_modules/@groove-dev/gui/src/components/settings/remote-server-card.jsx +3 -3
  67. package/node_modules/@groove-dev/gui/src/components/settings/server-detail.jsx +310 -0
  68. package/node_modules/@groove-dev/gui/src/components/settings/server-dialog.jsx +4 -1
  69. package/node_modules/@groove-dev/gui/src/components/settings/server-list.jsx +59 -0
  70. package/node_modules/@groove-dev/gui/src/components/settings/ssh-wizard.jsx +549 -0
  71. package/node_modules/@groove-dev/gui/src/components/toys/toy-card.jsx +78 -0
  72. package/node_modules/@groove-dev/gui/src/components/toys/toy-creator.jsx +144 -0
  73. package/node_modules/@groove-dev/gui/src/components/toys/toy-launcher.jsx +187 -0
  74. package/node_modules/@groove-dev/gui/src/components/ui/toast.jsx +2 -2
  75. package/node_modules/@groove-dev/gui/src/lib/electron.js +15 -0
  76. package/node_modules/@groove-dev/gui/src/lib/format.js +1 -0
  77. package/node_modules/@groove-dev/gui/src/stores/groove.js +373 -58
  78. package/node_modules/@groove-dev/gui/src/views/agents.jsx +148 -42
  79. package/node_modules/@groove-dev/gui/src/views/editor.jsx +92 -2
  80. package/node_modules/@groove-dev/gui/src/views/federation.jsx +37 -0
  81. package/node_modules/@groove-dev/gui/src/views/marketplace.jsx +2 -42
  82. package/node_modules/@groove-dev/gui/src/views/settings.jsx +32 -132
  83. package/node_modules/@groove-dev/gui/src/views/subscription-panel.jsx +327 -0
  84. package/node_modules/@groove-dev/gui/src/views/teams.jsx +3 -3
  85. package/node_modules/@groove-dev/gui/src/views/toys.jsx +162 -0
  86. package/package.json +1 -1
  87. package/packages/daemon/src/api.js +587 -68
  88. package/packages/daemon/src/classifier.js +24 -0
  89. package/packages/daemon/src/credentials.js +12 -2
  90. package/packages/daemon/src/federation/ambassador.js +204 -0
  91. package/packages/daemon/src/federation/connection.js +359 -0
  92. package/packages/daemon/src/federation/contracts.js +112 -0
  93. package/packages/daemon/src/federation/whitelist.js +190 -0
  94. package/packages/daemon/src/federation.js +166 -7
  95. package/packages/daemon/src/index.js +172 -19
  96. package/packages/daemon/src/introducer.js +52 -7
  97. package/packages/daemon/src/journalist.js +46 -1
  98. package/packages/daemon/src/memory.js +36 -16
  99. package/packages/daemon/src/process.js +140 -23
  100. package/packages/daemon/src/providers/base.js +1 -0
  101. package/packages/daemon/src/providers/claude-code.js +1 -0
  102. package/packages/daemon/src/providers/codex.js +124 -28
  103. package/packages/daemon/src/providers/gemini.js +104 -17
  104. package/packages/daemon/src/providers/index.js +17 -0
  105. package/packages/daemon/src/registry.js +10 -1
  106. package/packages/daemon/src/rotator.js +93 -30
  107. package/packages/daemon/src/skills.js +33 -3
  108. package/packages/daemon/src/terminal-pty.js +9 -1
  109. package/packages/daemon/src/tool-executor.js +11 -5
  110. package/packages/daemon/src/toys.js +69 -0
  111. package/packages/daemon/src/tunnel-manager.js +24 -5
  112. package/packages/daemon/templates/toys-catalog.json +242 -0
  113. package/packages/gui/dist/assets/index-BglPgjlu.js +8607 -0
  114. package/packages/gui/dist/assets/index-CGcwmmJv.css +1 -0
  115. package/packages/gui/dist/index.html +3 -2
  116. package/packages/gui/index.html +1 -0
  117. package/packages/gui/src/app.css +7 -0
  118. package/packages/gui/src/app.jsx +37 -10
  119. package/packages/gui/src/components/agents/agent-chat.jsx +21 -31
  120. package/packages/gui/src/components/agents/agent-config.jsx +11 -6
  121. package/packages/gui/src/components/agents/agent-feed.jsx +2 -2
  122. package/packages/gui/src/components/agents/spawn-wizard.jsx +42 -1
  123. package/packages/gui/src/components/editor/breadcrumbs.jsx +30 -0
  124. package/packages/gui/src/components/editor/code-editor.jsx +33 -2
  125. package/packages/gui/src/components/editor/editor-status-bar.jsx +26 -0
  126. package/packages/gui/src/components/editor/editor-tabs.jsx +113 -34
  127. package/packages/gui/src/components/editor/goto-line.jsx +35 -0
  128. package/packages/gui/src/components/editor/terminal.jsx +12 -6
  129. package/packages/gui/src/components/layout/activity-bar.jsx +13 -3
  130. package/packages/gui/src/components/layout/app-shell.jsx +0 -1
  131. package/packages/gui/src/components/layout/breadcrumb-bar.jsx +165 -47
  132. package/packages/gui/src/components/layout/command-palette.jsx +6 -2
  133. package/packages/gui/src/components/layout/terminal-panel.jsx +10 -9
  134. package/packages/gui/src/components/marketplace/repo-import.jsx +9 -1
  135. package/packages/gui/src/components/onboarding/provider-card.jsx +134 -0
  136. package/packages/gui/src/components/onboarding/setup-wizard.jsx +819 -0
  137. package/packages/gui/src/components/pro/pro-gate.jsx +12 -5
  138. package/packages/gui/src/components/pro/upgrade-card.jsx +15 -8
  139. package/packages/gui/src/components/pro/upgrade-modal.jsx +151 -0
  140. package/packages/gui/src/components/settings/federation-activity.jsx +98 -0
  141. package/packages/gui/src/components/settings/federation-panel.jsx +290 -0
  142. package/packages/gui/src/components/settings/federation-peers.jsx +126 -0
  143. package/packages/gui/src/components/settings/federation-wizard.jsx +293 -0
  144. package/packages/gui/src/components/settings/quick-connect.jsx +110 -67
  145. package/packages/gui/src/components/settings/remote-server-card.jsx +3 -3
  146. package/packages/gui/src/components/settings/server-detail.jsx +310 -0
  147. package/packages/gui/src/components/settings/server-dialog.jsx +4 -1
  148. package/packages/gui/src/components/settings/server-list.jsx +59 -0
  149. package/packages/gui/src/components/settings/ssh-wizard.jsx +549 -0
  150. package/packages/gui/src/components/toys/toy-card.jsx +78 -0
  151. package/packages/gui/src/components/toys/toy-creator.jsx +144 -0
  152. package/packages/gui/src/components/toys/toy-launcher.jsx +187 -0
  153. package/packages/gui/src/components/ui/toast.jsx +2 -2
  154. package/packages/gui/src/lib/electron.js +15 -0
  155. package/packages/gui/src/lib/format.js +1 -0
  156. package/packages/gui/src/stores/groove.js +373 -58
  157. package/packages/gui/src/views/agents.jsx +148 -42
  158. package/packages/gui/src/views/editor.jsx +92 -2
  159. package/packages/gui/src/views/federation.jsx +37 -0
  160. package/packages/gui/src/views/marketplace.jsx +2 -42
  161. package/packages/gui/src/views/settings.jsx +32 -132
  162. package/packages/gui/src/views/subscription-panel.jsx +327 -0
  163. package/packages/gui/src/views/teams.jsx +3 -3
  164. package/packages/gui/src/views/toys.jsx +162 -0
  165. package/plans/chat-persistence-refactor.md +154 -0
  166. package/node_modules/@groove-dev/gui/dist/assets/index-BE6lYcd7.css +0 -1
  167. package/node_modules/@groove-dev/gui/dist/assets/index-zdzOLAZM.js +0 -677
  168. package/packages/gui/dist/assets/index-BE6lYcd7.css +0 -1
  169. package/packages/gui/dist/assets/index-zdzOLAZM.js +0 -677
@@ -0,0 +1,242 @@
1
+ [
2
+ {
3
+ "id": "nasa-eonet",
4
+ "name": "NASA Earth Observatory",
5
+ "description": "Track natural events on Earth in real-time — wildfires, storms, volcanic eruptions, and more from NASA's EONET feed.",
6
+ "category": "space",
7
+ "icon": "Globe",
8
+ "docsUrl": "https://eonet.gsfc.nasa.gov/docs/v3",
9
+ "baseUrl": "https://eonet.gsfc.nasa.gov/api/v3",
10
+ "authType": "apiKey",
11
+ "keyHeader": "api_key",
12
+ "sampleEndpoints": [
13
+ "GET /events",
14
+ "GET /events?status=open",
15
+ "GET /categories",
16
+ "GET /events?category=wildfires"
17
+ ],
18
+ "starterPrompts": [
19
+ "Build a live wildfire tracker with map visualization",
20
+ "Create a natural disaster dashboard with event timelines",
21
+ "Build an alert system for volcanic eruptions near populated areas",
22
+ "Visualize storm patterns across the globe over the last 30 days"
23
+ ],
24
+ "difficulty": "intermediate"
25
+ },
26
+ {
27
+ "id": "nasa-apod",
28
+ "name": "NASA Astronomy Picture of the Day",
29
+ "description": "Access NASA's iconic daily astronomy images and explanations — one stunning space photo every day since 1995.",
30
+ "category": "space",
31
+ "icon": "Globe",
32
+ "docsUrl": "https://api.nasa.gov",
33
+ "baseUrl": "https://api.nasa.gov/planetary",
34
+ "authType": "apiKey",
35
+ "keyHeader": "api_key",
36
+ "sampleEndpoints": [
37
+ "GET /apod?api_key=DEMO_KEY",
38
+ "GET /apod?date=2024-01-01",
39
+ "GET /apod?start_date=2024-01-01&end_date=2024-01-07",
40
+ "GET /apod?count=5"
41
+ ],
42
+ "starterPrompts": [
43
+ "Build a space photo gallery with daily updates",
44
+ "Create a screensaver app that cycles through APOD images",
45
+ "Build a quiz game using astronomy photo descriptions",
46
+ "Make a calendar app with a space photo for each day"
47
+ ],
48
+ "difficulty": "beginner"
49
+ },
50
+ {
51
+ "id": "openweathermap",
52
+ "name": "OpenWeatherMap",
53
+ "description": "Get current weather, forecasts, and historical data for any location on Earth with this popular weather API.",
54
+ "category": "weather",
55
+ "icon": "Cloud",
56
+ "docsUrl": "https://openweathermap.org/api",
57
+ "baseUrl": "https://api.openweathermap.org/data/2.5",
58
+ "authType": "apiKey",
59
+ "keyHeader": "appid",
60
+ "sampleEndpoints": [
61
+ "GET /weather?q=London&appid=KEY",
62
+ "GET /forecast?q=Tokyo&appid=KEY",
63
+ "GET /weather?lat=40.7&lon=-74.0&appid=KEY",
64
+ "GET /air_pollution?lat=50&lon=50&appid=KEY"
65
+ ],
66
+ "starterPrompts": [
67
+ "Build a weather dashboard with 5-day forecasts",
68
+ "Create a travel planner that suggests destinations by weather",
69
+ "Build an air quality monitor for major cities",
70
+ "Make a weather comparison tool for two cities side by side"
71
+ ],
72
+ "difficulty": "beginner"
73
+ },
74
+ {
75
+ "id": "coingecko",
76
+ "name": "CoinGecko",
77
+ "description": "Free crypto market data — prices, market caps, volumes, and trending coins across thousands of cryptocurrencies.",
78
+ "category": "finance",
79
+ "icon": "Coins",
80
+ "docsUrl": "https://docs.coingecko.com/v3",
81
+ "baseUrl": "https://api.coingecko.com/api/v3",
82
+ "authType": "none",
83
+ "keyHeader": null,
84
+ "sampleEndpoints": [
85
+ "GET /simple/price?ids=bitcoin&vs_currencies=usd",
86
+ "GET /coins/markets?vs_currency=usd&order=market_cap_desc",
87
+ "GET /search/trending",
88
+ "GET /coins/bitcoin/market_chart?vs_currency=usd&days=30"
89
+ ],
90
+ "starterPrompts": [
91
+ "Build a crypto portfolio tracker with live prices",
92
+ "Create a trending coins dashboard with price charts",
93
+ "Build a price alert system for your favorite coins",
94
+ "Make a crypto market overview with top gainers and losers"
95
+ ],
96
+ "difficulty": "beginner"
97
+ },
98
+ {
99
+ "id": "alpha-vantage",
100
+ "name": "Alpha Vantage",
101
+ "description": "Stock market data, forex, and crypto through a powerful financial API — real-time and historical time series.",
102
+ "category": "finance",
103
+ "icon": "Coins",
104
+ "docsUrl": "https://www.alphavantage.co/documentation",
105
+ "baseUrl": "https://www.alphavantage.co",
106
+ "authType": "apiKey",
107
+ "keyHeader": "apikey",
108
+ "sampleEndpoints": [
109
+ "GET /query?function=TIME_SERIES_DAILY&symbol=AAPL&apikey=KEY",
110
+ "GET /query?function=GLOBAL_QUOTE&symbol=MSFT&apikey=KEY",
111
+ "GET /query?function=SYMBOL_SEARCH&keywords=tesla&apikey=KEY",
112
+ "GET /query?function=NEWS_SENTIMENT&tickers=AAPL&apikey=KEY"
113
+ ],
114
+ "starterPrompts": [
115
+ "Build a stock screener with technical indicators",
116
+ "Create a portfolio analyzer with historical performance charts",
117
+ "Build a stock news sentiment tracker",
118
+ "Make a comparison tool for multiple stocks over time"
119
+ ],
120
+ "difficulty": "intermediate"
121
+ },
122
+ {
123
+ "id": "pokeapi",
124
+ "name": "PokeAPI",
125
+ "description": "The complete Pokemon encyclopedia API — every Pokemon, move, ability, and item from all generations.",
126
+ "category": "fun",
127
+ "icon": "Gamepad2",
128
+ "docsUrl": "https://pokeapi.co/docs/v2",
129
+ "baseUrl": "https://pokeapi.co/api/v2",
130
+ "authType": "none",
131
+ "keyHeader": null,
132
+ "sampleEndpoints": [
133
+ "GET /pokemon/pikachu",
134
+ "GET /pokemon?limit=20&offset=0",
135
+ "GET /type/fire",
136
+ "GET /ability/overgrow"
137
+ ],
138
+ "starterPrompts": [
139
+ "Build a Pokedex with search and type filtering",
140
+ "Create a Pokemon battle simulator",
141
+ "Build a team builder that suggests balanced teams",
142
+ "Make a Pokemon quiz game with sprites and stats"
143
+ ],
144
+ "difficulty": "beginner"
145
+ },
146
+ {
147
+ "id": "open-trivia-db",
148
+ "name": "Open Trivia DB",
149
+ "description": "Free trivia question database with thousands of questions across dozens of categories and difficulty levels.",
150
+ "category": "fun",
151
+ "icon": "Gamepad2",
152
+ "docsUrl": "https://opentdb.com/api_config.php",
153
+ "baseUrl": "https://opentdb.com",
154
+ "authType": "none",
155
+ "keyHeader": null,
156
+ "sampleEndpoints": [
157
+ "GET /api.php?amount=10",
158
+ "GET /api.php?amount=10&category=9&difficulty=easy",
159
+ "GET /api_category.php",
160
+ "GET /api.php?amount=10&type=multiple"
161
+ ],
162
+ "starterPrompts": [
163
+ "Build a multiplayer trivia game with scoreboards",
164
+ "Create a daily trivia challenge with streaks",
165
+ "Build a study tool that quizzes you on specific topics",
166
+ "Make a trivia night host app with rounds and scoring"
167
+ ],
168
+ "difficulty": "beginner"
169
+ },
170
+ {
171
+ "id": "nominatim-osm",
172
+ "name": "Nominatim / OpenStreetMap",
173
+ "description": "Free geocoding and reverse geocoding powered by OpenStreetMap — turn addresses into coordinates and back.",
174
+ "category": "maps",
175
+ "icon": "Map",
176
+ "docsUrl": "https://nominatim.org/release-docs/develop/api/Overview",
177
+ "baseUrl": "https://nominatim.openstreetmap.org",
178
+ "authType": "none",
179
+ "keyHeader": null,
180
+ "sampleEndpoints": [
181
+ "GET /search?q=London&format=json",
182
+ "GET /reverse?lat=51.5&lon=-0.1&format=json",
183
+ "GET /search?q=restaurants+near+times+square&format=json",
184
+ "GET /lookup?osm_ids=R146656&format=json"
185
+ ],
186
+ "starterPrompts": [
187
+ "Build a location search tool with map preview",
188
+ "Create a distance calculator between any two places",
189
+ "Build a geocoding batch tool for CSV address lists",
190
+ "Make a neighborhood explorer that shows nearby points of interest"
191
+ ],
192
+ "difficulty": "beginner"
193
+ },
194
+ {
195
+ "id": "jsonplaceholder",
196
+ "name": "JSONPlaceholder",
197
+ "description": "A free fake REST API for testing and prototyping — perfect for learning HTTP requests with realistic data.",
198
+ "category": "data",
199
+ "icon": "Database",
200
+ "docsUrl": "https://jsonplaceholder.typicode.com/guide",
201
+ "baseUrl": "https://jsonplaceholder.typicode.com",
202
+ "authType": "none",
203
+ "keyHeader": null,
204
+ "sampleEndpoints": [
205
+ "GET /posts",
206
+ "GET /users/1",
207
+ "GET /posts/1/comments",
208
+ "POST /posts"
209
+ ],
210
+ "starterPrompts": [
211
+ "Build a social media feed with posts and comments",
212
+ "Create a user directory with profile cards",
213
+ "Build a todo app backed by the API",
214
+ "Make a blog engine with CRUD operations"
215
+ ],
216
+ "difficulty": "beginner"
217
+ },
218
+ {
219
+ "id": "the-dog-api",
220
+ "name": "The Dog API",
221
+ "description": "Browse every dog breed with images, temperaments, and stats — a fun API for dog lovers and quick prototypes.",
222
+ "category": "fun",
223
+ "icon": "Gamepad2",
224
+ "docsUrl": "https://docs.thedogapi.com",
225
+ "baseUrl": "https://api.thedogapi.com/v1",
226
+ "authType": "none",
227
+ "keyHeader": null,
228
+ "sampleEndpoints": [
229
+ "GET /breeds",
230
+ "GET /images/search?limit=10",
231
+ "GET /breeds/search?q=labrador",
232
+ "GET /breeds?limit=10&page=0"
233
+ ],
234
+ "starterPrompts": [
235
+ "Build a dog breed encyclopedia with photos",
236
+ "Create a random dog image gallery",
237
+ "Build a dog breed quiz — guess the breed from the photo",
238
+ "Make a dog breed comparison tool with stats and images"
239
+ ],
240
+ "difficulty": "beginner"
241
+ }
242
+ ]