@hitechclaw/clawspark 2.0.0

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 (49) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/LICENSE +21 -0
  3. package/README.md +378 -0
  4. package/clawspark +2715 -0
  5. package/configs/models.yaml +108 -0
  6. package/configs/skill-packs.yaml +44 -0
  7. package/configs/skills.yaml +37 -0
  8. package/install.sh +387 -0
  9. package/lib/common.sh +249 -0
  10. package/lib/detect-hardware.sh +156 -0
  11. package/lib/diagnose.sh +636 -0
  12. package/lib/render-diagram.sh +47 -0
  13. package/lib/sandbox-commands.sh +415 -0
  14. package/lib/secure.sh +244 -0
  15. package/lib/select-model.sh +442 -0
  16. package/lib/setup-browser.sh +138 -0
  17. package/lib/setup-dashboard.sh +228 -0
  18. package/lib/setup-inference.sh +128 -0
  19. package/lib/setup-mcp.sh +142 -0
  20. package/lib/setup-messaging.sh +242 -0
  21. package/lib/setup-models.sh +121 -0
  22. package/lib/setup-openclaw.sh +808 -0
  23. package/lib/setup-sandbox.sh +188 -0
  24. package/lib/setup-skills.sh +113 -0
  25. package/lib/setup-systemd.sh +224 -0
  26. package/lib/setup-tailscale.sh +188 -0
  27. package/lib/setup-voice.sh +101 -0
  28. package/lib/skill-audit.sh +449 -0
  29. package/lib/verify.sh +177 -0
  30. package/package.json +57 -0
  31. package/scripts/release.sh +133 -0
  32. package/uninstall.sh +161 -0
  33. package/v2/README.md +50 -0
  34. package/v2/configs/providers.yaml +79 -0
  35. package/v2/configs/skills.yaml +36 -0
  36. package/v2/install.sh +116 -0
  37. package/v2/lib/common.sh +285 -0
  38. package/v2/lib/detect-hardware.sh +119 -0
  39. package/v2/lib/select-runtime.sh +273 -0
  40. package/v2/lib/setup-extras.sh +95 -0
  41. package/v2/lib/setup-openclaw.sh +187 -0
  42. package/v2/lib/setup-provider.sh +131 -0
  43. package/v2/lib/verify.sh +133 -0
  44. package/web/index.html +1835 -0
  45. package/web/install.sh +387 -0
  46. package/web/logo-hero.svg +11 -0
  47. package/web/logo-icon.svg +12 -0
  48. package/web/logo.svg +17 -0
  49. package/web/vercel.json +8 -0
package/web/index.html ADDED
@@ -0,0 +1,1835 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Clawspark - One Command. Private AI Agent. Your Hardware.</title>
7
+ <meta name="description" content="One-click installer for a fully private AI agent on your own hardware. Code, research, browse the web, analyze images, and automate tasks on DGX Spark, RTX GPUs, Mac, or Jetson. No cloud. No API keys. No data leaves your machine.">
8
+ <link rel="icon" type="image/svg+xml" href="logo-icon.svg">
9
+ <link rel="preconnect" href="https://fonts.googleapis.com">
10
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
11
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
12
+ <style>
13
+ *, *::before, *::after {
14
+ margin: 0;
15
+ padding: 0;
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ html {
20
+ scroll-behavior: smooth;
21
+ }
22
+
23
+ body {
24
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
25
+ background: #0a0a0a;
26
+ color: #e0e0e0;
27
+ line-height: 1.6;
28
+ overflow-x: hidden;
29
+ }
30
+
31
+ /* Utility */
32
+ .container {
33
+ max-width: 1140px;
34
+ margin: 0 auto;
35
+ padding: 0 24px;
36
+ }
37
+
38
+ a {
39
+ color: #76b900;
40
+ text-decoration: none;
41
+ transition: color 0.2s ease;
42
+ }
43
+
44
+ a:hover {
45
+ color: #8ed600;
46
+ }
47
+
48
+ /* Navigation */
49
+ nav {
50
+ position: fixed;
51
+ top: 0;
52
+ left: 0;
53
+ right: 0;
54
+ z-index: 100;
55
+ background: rgba(10, 10, 10, 0.85);
56
+ backdrop-filter: blur(16px);
57
+ -webkit-backdrop-filter: blur(16px);
58
+ border-bottom: 1px solid rgba(118, 185, 0, 0.1);
59
+ padding: 16px 0;
60
+ }
61
+
62
+ nav .container {
63
+ display: flex;
64
+ align-items: center;
65
+ justify-content: space-between;
66
+ }
67
+
68
+ nav .logo {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 10px;
72
+ font-size: 1.25rem;
73
+ font-weight: 800;
74
+ color: #76b900;
75
+ letter-spacing: -0.02em;
76
+ }
77
+
78
+ nav .logo img {
79
+ height: 32px;
80
+ width: 32px;
81
+ }
82
+
83
+ nav .nav-links {
84
+ display: flex;
85
+ gap: 28px;
86
+ list-style: none;
87
+ }
88
+
89
+ nav .nav-links a {
90
+ color: #999;
91
+ font-size: 0.875rem;
92
+ font-weight: 500;
93
+ transition: color 0.2s ease;
94
+ }
95
+
96
+ nav .nav-links a:hover {
97
+ color: #fff;
98
+ }
99
+
100
+ /* Fade-in animation */
101
+ .fade-in {
102
+ opacity: 0;
103
+ transform: translateY(30px);
104
+ transition: opacity 0.7s ease, transform 0.7s ease;
105
+ }
106
+
107
+ .fade-in.visible {
108
+ opacity: 1;
109
+ transform: translateY(0);
110
+ }
111
+
112
+ /* Section styling */
113
+ section {
114
+ padding: 100px 0;
115
+ }
116
+
117
+ .section-title {
118
+ font-size: 2.25rem;
119
+ font-weight: 800;
120
+ color: #fff;
121
+ margin-bottom: 16px;
122
+ letter-spacing: -0.03em;
123
+ }
124
+
125
+ .section-subtitle {
126
+ font-size: 1.1rem;
127
+ color: #888;
128
+ margin-bottom: 56px;
129
+ max-width: 560px;
130
+ }
131
+
132
+ /* ===================== */
133
+ /* HERO */
134
+ /* ===================== */
135
+ .hero {
136
+ min-height: 100vh;
137
+ display: flex;
138
+ align-items: center;
139
+ justify-content: center;
140
+ text-align: center;
141
+ padding-top: 80px;
142
+ position: relative;
143
+ background:
144
+ radial-gradient(ellipse 60% 40% at 50% 0%, rgba(118, 185, 0, 0.08) 0%, transparent 70%),
145
+ radial-gradient(ellipse 50% 50% at 80% 80%, rgba(255, 107, 53, 0.04) 0%, transparent 60%),
146
+ #0a0a0a;
147
+ }
148
+
149
+ .hero-content {
150
+ max-width: 740px;
151
+ }
152
+
153
+ .hero-badge {
154
+ display: inline-block;
155
+ padding: 6px 16px;
156
+ border: 1px solid rgba(118, 185, 0, 0.3);
157
+ border-radius: 100px;
158
+ font-size: 0.8rem;
159
+ font-weight: 500;
160
+ color: #76b900;
161
+ margin-bottom: 32px;
162
+ background: rgba(118, 185, 0, 0.06);
163
+ }
164
+
165
+ .hero-title {
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: center;
169
+ gap: 20px;
170
+ margin-bottom: 20px;
171
+ }
172
+
173
+ .hero-title img {
174
+ width: clamp(60px, 10vw, 90px);
175
+ height: clamp(60px, 10vw, 90px);
176
+ }
177
+
178
+ .hero h1 {
179
+ font-size: clamp(3.5rem, 8vw, 6rem);
180
+ font-weight: 900;
181
+ letter-spacing: -0.04em;
182
+ line-height: 1;
183
+ color: #fff;
184
+ margin-bottom: 0;
185
+ text-shadow:
186
+ 0 0 80px rgba(118, 185, 0, 0.3),
187
+ 0 0 160px rgba(118, 185, 0, 0.1);
188
+ }
189
+
190
+ .hero h1 .accent {
191
+ background: linear-gradient(135deg, #76b900, #8ed600);
192
+ -webkit-background-clip: text;
193
+ -webkit-text-fill-color: transparent;
194
+ background-clip: text;
195
+ }
196
+
197
+ .hero .tagline {
198
+ font-size: clamp(1.1rem, 2.5vw, 1.4rem);
199
+ font-weight: 400;
200
+ color: #bbb;
201
+ margin-bottom: 16px;
202
+ letter-spacing: -0.01em;
203
+ }
204
+
205
+ .hero .description {
206
+ font-size: 1rem;
207
+ color: #777;
208
+ max-width: 520px;
209
+ margin: 0 auto 40px;
210
+ line-height: 1.7;
211
+ }
212
+
213
+ /* Code block (terminal style) */
214
+ .code-block {
215
+ position: relative;
216
+ background: #111;
217
+ border: 1px solid #222;
218
+ border-radius: 12px;
219
+ padding: 20px 24px;
220
+ margin: 0 auto;
221
+ max-width: 600px;
222
+ text-align: left;
223
+ overflow: hidden;
224
+ }
225
+
226
+ .code-block::before {
227
+ content: '';
228
+ position: absolute;
229
+ top: 0;
230
+ left: 0;
231
+ right: 0;
232
+ height: 1px;
233
+ background: linear-gradient(90deg, transparent, rgba(118, 185, 0, 0.3), transparent);
234
+ }
235
+
236
+ .code-block .terminal-dots {
237
+ display: flex;
238
+ gap: 6px;
239
+ margin-bottom: 14px;
240
+ }
241
+
242
+ .code-block .terminal-dots span {
243
+ width: 10px;
244
+ height: 10px;
245
+ border-radius: 50%;
246
+ display: block;
247
+ }
248
+
249
+ .code-block .terminal-dots span:nth-child(1) { background: #ff5f57; }
250
+ .code-block .terminal-dots span:nth-child(2) { background: #ffbd2e; }
251
+ .code-block .terminal-dots span:nth-child(3) { background: #28ca41; }
252
+
253
+ .code-block code {
254
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
255
+ font-size: 0.9rem;
256
+ color: #76b900;
257
+ word-break: break-all;
258
+ display: block;
259
+ line-height: 1.6;
260
+ }
261
+
262
+ .code-block code .prompt {
263
+ color: #ff6b35;
264
+ }
265
+
266
+ .copy-btn {
267
+ position: absolute;
268
+ top: 16px;
269
+ right: 16px;
270
+ background: rgba(255, 255, 255, 0.06);
271
+ border: 1px solid #333;
272
+ color: #888;
273
+ padding: 6px 14px;
274
+ border-radius: 6px;
275
+ font-size: 0.75rem;
276
+ font-family: 'Inter', sans-serif;
277
+ font-weight: 500;
278
+ cursor: pointer;
279
+ transition: all 0.2s ease;
280
+ }
281
+
282
+ .copy-btn:hover {
283
+ background: rgba(118, 185, 0, 0.1);
284
+ border-color: #76b900;
285
+ color: #76b900;
286
+ }
287
+
288
+ .copy-btn.copied {
289
+ background: rgba(118, 185, 0, 0.15);
290
+ border-color: #76b900;
291
+ color: #76b900;
292
+ }
293
+
294
+ /* ===================== */
295
+ /* FEATURES */
296
+ /* ===================== */
297
+ .features {
298
+ background:
299
+ radial-gradient(ellipse 50% 30% at 20% 50%, rgba(118, 185, 0, 0.04) 0%, transparent 60%),
300
+ #0a0a0a;
301
+ }
302
+
303
+ .features-grid {
304
+ display: grid;
305
+ grid-template-columns: repeat(3, 1fr);
306
+ gap: 20px;
307
+ }
308
+
309
+ .feature-card {
310
+ background: rgba(255, 255, 255, 0.02);
311
+ border: 1px solid #1a1a1a;
312
+ border-radius: 16px;
313
+ padding: 32px 28px;
314
+ transition: all 0.3s ease;
315
+ }
316
+
317
+ .feature-card:hover {
318
+ border-color: rgba(118, 185, 0, 0.2);
319
+ background: rgba(118, 185, 0, 0.03);
320
+ transform: translateY(-2px);
321
+ }
322
+
323
+ .feature-icon {
324
+ width: 44px;
325
+ height: 44px;
326
+ border-radius: 10px;
327
+ display: flex;
328
+ align-items: center;
329
+ justify-content: center;
330
+ margin-bottom: 20px;
331
+ font-size: 1.3rem;
332
+ background: rgba(118, 185, 0, 0.1);
333
+ color: #76b900;
334
+ }
335
+
336
+ .feature-card:nth-child(even) .feature-icon {
337
+ background: rgba(255, 107, 53, 0.1);
338
+ color: #ff6b35;
339
+ }
340
+
341
+ .feature-card h3 {
342
+ font-size: 1.05rem;
343
+ font-weight: 700;
344
+ color: #fff;
345
+ margin-bottom: 10px;
346
+ letter-spacing: -0.01em;
347
+ }
348
+
349
+ .feature-card p {
350
+ font-size: 0.9rem;
351
+ color: #777;
352
+ line-height: 1.6;
353
+ }
354
+
355
+ /* ===================== */
356
+ /* SECURITY */
357
+ /* ===================== */
358
+ .security {
359
+ background:
360
+ radial-gradient(ellipse 50% 35% at 70% 40%, rgba(118, 185, 0, 0.05) 0%, transparent 60%),
361
+ radial-gradient(ellipse 40% 30% at 20% 70%, rgba(255, 107, 53, 0.03) 0%, transparent 60%),
362
+ #0a0a0a;
363
+ }
364
+
365
+ .security-grid {
366
+ display: grid;
367
+ grid-template-columns: repeat(2, 1fr);
368
+ gap: 20px;
369
+ }
370
+
371
+ .security-item {
372
+ display: flex;
373
+ gap: 18px;
374
+ align-items: flex-start;
375
+ background: rgba(255, 255, 255, 0.02);
376
+ border: 1px solid #1a1a1a;
377
+ border-radius: 16px;
378
+ padding: 28px 24px;
379
+ transition: all 0.3s ease;
380
+ }
381
+
382
+ .security-item:hover {
383
+ border-color: rgba(118, 185, 0, 0.2);
384
+ background: rgba(118, 185, 0, 0.03);
385
+ transform: translateY(-2px);
386
+ }
387
+
388
+ .security-icon {
389
+ flex-shrink: 0;
390
+ width: 44px;
391
+ height: 44px;
392
+ border-radius: 10px;
393
+ display: flex;
394
+ align-items: center;
395
+ justify-content: center;
396
+ background: rgba(118, 185, 0, 0.1);
397
+ color: #76b900;
398
+ }
399
+
400
+ .security-item:nth-child(even) .security-icon {
401
+ background: rgba(255, 107, 53, 0.1);
402
+ color: #ff6b35;
403
+ }
404
+
405
+ .security-content h3 {
406
+ font-size: 1.05rem;
407
+ font-weight: 700;
408
+ color: #fff;
409
+ margin-bottom: 6px;
410
+ letter-spacing: -0.01em;
411
+ }
412
+
413
+ .security-content p {
414
+ font-size: 0.9rem;
415
+ color: #777;
416
+ line-height: 1.6;
417
+ }
418
+
419
+ /* ===================== */
420
+ /* ARCHITECTURE */
421
+ /* ===================== */
422
+ .architecture {
423
+ background:
424
+ radial-gradient(ellipse 50% 40% at 50% 30%, rgba(118, 185, 0, 0.04) 0%, transparent 60%),
425
+ #0a0a0a;
426
+ }
427
+
428
+ .architecture .section-subtitle {
429
+ max-width: 600px;
430
+ }
431
+
432
+ .arch-diagram {
433
+ position: relative;
434
+ background: #111;
435
+ border: 1px solid #222;
436
+ border-radius: 12px;
437
+ padding: 20px 24px 28px;
438
+ margin: 0 auto 48px;
439
+ max-width: 620px;
440
+ overflow: hidden;
441
+ }
442
+
443
+ .arch-diagram::before {
444
+ content: '';
445
+ position: absolute;
446
+ top: 0;
447
+ left: 0;
448
+ right: 0;
449
+ height: 1px;
450
+ background: linear-gradient(90deg, transparent, rgba(118, 185, 0, 0.3), transparent);
451
+ }
452
+
453
+ .arch-diagram .terminal-dots {
454
+ display: flex;
455
+ gap: 6px;
456
+ margin-bottom: 14px;
457
+ }
458
+
459
+ .arch-diagram .terminal-dots span {
460
+ width: 10px;
461
+ height: 10px;
462
+ border-radius: 50%;
463
+ display: block;
464
+ }
465
+
466
+ .arch-diagram .terminal-dots span:nth-child(1) { background: #ff5f57; }
467
+ .arch-diagram .terminal-dots span:nth-child(2) { background: #ffbd2e; }
468
+ .arch-diagram .terminal-dots span:nth-child(3) { background: #28ca41; }
469
+
470
+ .arch-diagram pre {
471
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
472
+ font-size: 0.82rem;
473
+ line-height: 1.55;
474
+ color: #999;
475
+ overflow-x: auto;
476
+ }
477
+
478
+ .arch-diagram pre .arch-highlight {
479
+ color: #76b900;
480
+ font-weight: 500;
481
+ }
482
+
483
+ .arch-diagram pre .arch-accent {
484
+ color: #ff6b35;
485
+ }
486
+
487
+ .arch-diagram pre .arch-dim {
488
+ color: #555;
489
+ }
490
+
491
+ .arch-visual {
492
+ max-width: 680px;
493
+ margin: 0 auto 48px;
494
+ display: flex;
495
+ flex-direction: column;
496
+ gap: 0;
497
+ border-radius: 16px;
498
+ overflow: hidden;
499
+ border: 1px solid #2a2a2a;
500
+ background: #0f0f0f;
501
+ }
502
+
503
+ .arch-layer {
504
+ position: relative;
505
+ display: flex;
506
+ justify-content: center;
507
+ gap: 10px;
508
+ flex-wrap: wrap;
509
+ padding: 28px 24px 20px;
510
+ }
511
+
512
+ .arch-layer + .arch-layer {
513
+ border-top: 1px solid #222;
514
+ }
515
+
516
+ .arch-layer-label {
517
+ position: absolute;
518
+ top: 6px;
519
+ left: 14px;
520
+ font-size: 0.6rem;
521
+ font-weight: 700;
522
+ text-transform: uppercase;
523
+ letter-spacing: 0.1em;
524
+ color: #555;
525
+ }
526
+
527
+ .arch-arrow {
528
+ display: flex;
529
+ justify-content: center;
530
+ align-items: center;
531
+ height: 28px;
532
+ color: #444;
533
+ font-size: 0.75rem;
534
+ position: relative;
535
+ }
536
+
537
+ .arch-arrow::before {
538
+ content: '';
539
+ position: absolute;
540
+ left: 50%;
541
+ top: 0;
542
+ bottom: 8px;
543
+ width: 1px;
544
+ background: linear-gradient(to bottom, #333, #76b900);
545
+ transform: translateX(-50%);
546
+ }
547
+
548
+ .arch-arrow::after {
549
+ content: '';
550
+ position: absolute;
551
+ bottom: 4px;
552
+ left: 50%;
553
+ transform: translateX(-50%);
554
+ width: 0;
555
+ height: 0;
556
+ border-left: 4px solid transparent;
557
+ border-right: 4px solid transparent;
558
+ border-top: 5px solid #76b900;
559
+ }
560
+
561
+ .arch-node {
562
+ display: flex;
563
+ flex-direction: column;
564
+ align-items: center;
565
+ gap: 3px;
566
+ padding: 10px 16px;
567
+ border-radius: 8px;
568
+ border: 1px solid #333;
569
+ background: #161616;
570
+ min-width: 90px;
571
+ text-align: center;
572
+ transition: all 0.25s ease;
573
+ }
574
+
575
+ .arch-node:hover {
576
+ border-color: #76b900;
577
+ background: rgba(118, 185, 0, 0.06);
578
+ transform: translateY(-1px);
579
+ box-shadow: 0 4px 16px rgba(118, 185, 0, 0.1);
580
+ }
581
+
582
+ .arch-node-name {
583
+ font-size: 0.78rem;
584
+ font-weight: 600;
585
+ color: #ddd;
586
+ font-family: 'JetBrains Mono', monospace;
587
+ }
588
+
589
+ .arch-node-desc {
590
+ font-size: 0.65rem;
591
+ color: #666;
592
+ }
593
+
594
+ .arch-node.primary { border-color: rgba(118, 185, 0, 0.25); background: rgba(118, 185, 0, 0.04); }
595
+ .arch-node.primary .arch-node-name { color: #76b900; }
596
+ .arch-node.accent { border-color: rgba(255, 107, 53, 0.25); background: rgba(255, 107, 53, 0.04); }
597
+ .arch-node.accent .arch-node-name { color: #ff6b35; }
598
+ .arch-node.wide { flex: 1; max-width: 100%; }
599
+
600
+ @media (max-width: 640px) {
601
+ .arch-node { min-width: 75px; padding: 8px 10px; }
602
+ .arch-node-name { font-size: 0.7rem; }
603
+ }
604
+
605
+ .stat-boxes {
606
+ display: grid;
607
+ grid-template-columns: repeat(4, 1fr);
608
+ gap: 16px;
609
+ max-width: 720px;
610
+ margin: 0 auto;
611
+ }
612
+
613
+ .stat-box {
614
+ text-align: center;
615
+ background: rgba(255, 255, 255, 0.02);
616
+ border: 1px solid #1a1a1a;
617
+ border-radius: 12px;
618
+ padding: 24px 16px;
619
+ transition: all 0.3s ease;
620
+ }
621
+
622
+ .stat-box:hover {
623
+ border-color: rgba(118, 185, 0, 0.2);
624
+ background: rgba(118, 185, 0, 0.03);
625
+ transform: translateY(-2px);
626
+ }
627
+
628
+ .stat-box .stat-value {
629
+ font-size: 1.5rem;
630
+ font-weight: 800;
631
+ color: #76b900;
632
+ letter-spacing: -0.02em;
633
+ margin-bottom: 4px;
634
+ }
635
+
636
+ .stat-box:nth-child(even) .stat-value {
637
+ color: #ff6b35;
638
+ }
639
+
640
+ .stat-box .stat-label {
641
+ font-size: 0.78rem;
642
+ color: #666;
643
+ font-weight: 500;
644
+ text-transform: uppercase;
645
+ letter-spacing: 0.04em;
646
+ }
647
+
648
+ /* ===================== */
649
+ /* HARDWARE TABLE */
650
+ /* ===================== */
651
+ .hardware {
652
+ background:
653
+ radial-gradient(ellipse 60% 30% at 80% 20%, rgba(255, 107, 53, 0.04) 0%, transparent 60%),
654
+ #0a0a0a;
655
+ }
656
+
657
+ .table-wrapper {
658
+ overflow-x: auto;
659
+ border-radius: 16px;
660
+ border: 1px solid #1a1a1a;
661
+ background: rgba(255, 255, 255, 0.01);
662
+ }
663
+
664
+ table {
665
+ width: 100%;
666
+ border-collapse: collapse;
667
+ min-width: 600px;
668
+ }
669
+
670
+ thead th {
671
+ text-align: left;
672
+ padding: 18px 24px;
673
+ font-size: 0.8rem;
674
+ font-weight: 600;
675
+ text-transform: uppercase;
676
+ letter-spacing: 0.06em;
677
+ color: #666;
678
+ border-bottom: 1px solid #1a1a1a;
679
+ background: rgba(255, 255, 255, 0.02);
680
+ }
681
+
682
+ tbody td {
683
+ padding: 18px 24px;
684
+ font-size: 0.95rem;
685
+ border-bottom: 1px solid #111;
686
+ color: #ccc;
687
+ }
688
+
689
+ tbody tr:last-child td {
690
+ border-bottom: none;
691
+ }
692
+
693
+ tbody tr:hover {
694
+ background: rgba(118, 185, 0, 0.03);
695
+ }
696
+
697
+ .hw-name {
698
+ font-weight: 600;
699
+ color: #fff;
700
+ }
701
+
702
+ .hw-vram {
703
+ color: #76b900;
704
+ font-weight: 500;
705
+ }
706
+
707
+ .hw-perf {
708
+ font-weight: 500;
709
+ }
710
+
711
+ .perf-excellent { color: #76b900; }
712
+ .perf-great { color: #8ed600; }
713
+ .perf-good { color: #ff6b35; }
714
+
715
+ /* ===================== */
716
+ /* HOW IT WORKS */
717
+ /* ===================== */
718
+ .how-it-works {
719
+ background:
720
+ radial-gradient(ellipse 40% 40% at 50% 50%, rgba(118, 185, 0, 0.03) 0%, transparent 60%),
721
+ #0a0a0a;
722
+ }
723
+
724
+ .timeline {
725
+ position: relative;
726
+ max-width: 600px;
727
+ margin: 0 auto;
728
+ padding-left: 48px;
729
+ }
730
+
731
+ .timeline::before {
732
+ content: '';
733
+ position: absolute;
734
+ left: 15px;
735
+ top: 8px;
736
+ bottom: 8px;
737
+ width: 2px;
738
+ background: linear-gradient(to bottom, #76b900, rgba(255, 107, 53, 0.6), #76b900);
739
+ border-radius: 2px;
740
+ }
741
+
742
+ .timeline-step {
743
+ position: relative;
744
+ margin-bottom: 36px;
745
+ }
746
+
747
+ .timeline-step:last-child {
748
+ margin-bottom: 0;
749
+ }
750
+
751
+ .timeline-dot {
752
+ position: absolute;
753
+ left: -41px;
754
+ top: 4px;
755
+ width: 24px;
756
+ height: 24px;
757
+ border-radius: 50%;
758
+ background: #0a0a0a;
759
+ border: 2px solid #76b900;
760
+ display: flex;
761
+ align-items: center;
762
+ justify-content: center;
763
+ }
764
+
765
+ .timeline-dot::after {
766
+ content: '';
767
+ width: 8px;
768
+ height: 8px;
769
+ border-radius: 50%;
770
+ background: #76b900;
771
+ }
772
+
773
+ .timeline-step:last-child .timeline-dot {
774
+ border-color: #ff6b35;
775
+ }
776
+
777
+ .timeline-step:last-child .timeline-dot::after {
778
+ background: #ff6b35;
779
+ }
780
+
781
+ .timeline-step h4 {
782
+ font-size: 1.05rem;
783
+ font-weight: 700;
784
+ color: #fff;
785
+ margin-bottom: 4px;
786
+ }
787
+
788
+ .timeline-step .step-label {
789
+ font-size: 0.75rem;
790
+ font-weight: 600;
791
+ text-transform: uppercase;
792
+ letter-spacing: 0.08em;
793
+ color: #76b900;
794
+ margin-bottom: 6px;
795
+ }
796
+
797
+ .timeline-step p {
798
+ font-size: 0.9rem;
799
+ color: #777;
800
+ line-height: 1.5;
801
+ }
802
+
803
+ /* ===================== */
804
+ /* TOOLS INSTALLED */
805
+ /* ===================== */
806
+ .tools-section {
807
+ background:
808
+ radial-gradient(ellipse 50% 35% at 30% 40%, rgba(118, 185, 0, 0.04) 0%, transparent 60%),
809
+ radial-gradient(ellipse 40% 30% at 80% 70%, rgba(255, 107, 53, 0.03) 0%, transparent 60%),
810
+ #0a0a0a;
811
+ }
812
+
813
+ .tools-groups {
814
+ display: grid;
815
+ grid-template-columns: repeat(3, 1fr);
816
+ gap: 24px;
817
+ }
818
+
819
+ .tools-group {
820
+ background: rgba(255, 255, 255, 0.02);
821
+ border: 1px solid #1a1a1a;
822
+ border-radius: 16px;
823
+ padding: 32px 28px;
824
+ transition: all 0.3s ease;
825
+ }
826
+
827
+ .tools-group:hover {
828
+ border-color: rgba(118, 185, 0, 0.15);
829
+ background: rgba(118, 185, 0, 0.02);
830
+ }
831
+
832
+ .tools-group-header {
833
+ display: flex;
834
+ align-items: center;
835
+ gap: 12px;
836
+ margin-bottom: 24px;
837
+ padding-bottom: 16px;
838
+ border-bottom: 1px solid #1a1a1a;
839
+ }
840
+
841
+ .tools-group-icon {
842
+ width: 36px;
843
+ height: 36px;
844
+ border-radius: 8px;
845
+ display: flex;
846
+ align-items: center;
847
+ justify-content: center;
848
+ flex-shrink: 0;
849
+ }
850
+
851
+ .tools-group-icon.green {
852
+ background: rgba(118, 185, 0, 0.1);
853
+ color: #76b900;
854
+ }
855
+
856
+ .tools-group-icon.orange {
857
+ background: rgba(255, 107, 53, 0.1);
858
+ color: #ff6b35;
859
+ }
860
+
861
+ .tools-group-icon.grey {
862
+ background: rgba(255, 255, 255, 0.06);
863
+ color: #999;
864
+ }
865
+
866
+ .tools-group-header h3 {
867
+ font-size: 1rem;
868
+ font-weight: 700;
869
+ color: #fff;
870
+ letter-spacing: -0.01em;
871
+ }
872
+
873
+ .tools-list {
874
+ list-style: none;
875
+ display: flex;
876
+ flex-direction: column;
877
+ gap: 14px;
878
+ }
879
+
880
+ .tools-list.scrollable {
881
+ max-height: 182px;
882
+ overflow-y: auto;
883
+ padding-right: 6px;
884
+ mask-image: linear-gradient(to bottom, #000 80%, transparent 100%);
885
+ -webkit-mask-image: linear-gradient(to bottom, #000 80%, transparent 100%);
886
+ }
887
+
888
+ .tools-list.scrollable::-webkit-scrollbar {
889
+ width: 4px;
890
+ }
891
+
892
+ .tools-list.scrollable::-webkit-scrollbar-track {
893
+ background: transparent;
894
+ }
895
+
896
+ .tools-list.scrollable::-webkit-scrollbar-thumb {
897
+ background: rgba(118, 185, 0, 0.3);
898
+ border-radius: 4px;
899
+ }
900
+
901
+ .tools-list.scrollable::-webkit-scrollbar-thumb:hover {
902
+ background: rgba(118, 185, 0, 0.5);
903
+ }
904
+
905
+ .tools-scroll-hint {
906
+ text-align: center;
907
+ font-size: 0.75rem;
908
+ color: #555;
909
+ margin-top: 8px;
910
+ letter-spacing: 0.03em;
911
+ }
912
+
913
+ .tools-list li {
914
+ display: flex;
915
+ align-items: flex-start;
916
+ gap: 10px;
917
+ font-size: 0.9rem;
918
+ color: #999;
919
+ line-height: 1.5;
920
+ }
921
+
922
+ .tool-bullet {
923
+ flex-shrink: 0;
924
+ width: 6px;
925
+ height: 6px;
926
+ border-radius: 50%;
927
+ margin-top: 7px;
928
+ }
929
+
930
+ .tool-bullet.green {
931
+ background: #76b900;
932
+ }
933
+
934
+ .tool-bullet.orange {
935
+ background: #ff6b35;
936
+ }
937
+
938
+ .tool-bullet.grey {
939
+ background: #666;
940
+ }
941
+
942
+ .tools-list .tool-name {
943
+ color: #fff;
944
+ font-weight: 600;
945
+ }
946
+
947
+ .tools-list .tool-cmd {
948
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
949
+ font-size: 0.82rem;
950
+ color: #76b900;
951
+ background: rgba(118, 185, 0, 0.08);
952
+ padding: 1px 6px;
953
+ border-radius: 4px;
954
+ }
955
+
956
+ .tool-desc {
957
+ color: #666;
958
+ font-size: 0.82rem;
959
+ }
960
+
961
+ /* ===================== */
962
+ /* INSTALL SECTION */
963
+ /* ===================== */
964
+ .install-section {
965
+ text-align: center;
966
+ background:
967
+ radial-gradient(ellipse 60% 50% at 50% 50%, rgba(118, 185, 0, 0.06) 0%, transparent 60%),
968
+ #0a0a0a;
969
+ }
970
+
971
+ .install-section .section-subtitle {
972
+ margin-left: auto;
973
+ margin-right: auto;
974
+ }
975
+
976
+ .install-section .code-block {
977
+ max-width: 600px;
978
+ }
979
+
980
+ /* ===================== */
981
+ /* FOOTER */
982
+ /* ===================== */
983
+ footer {
984
+ border-top: 1px solid #151515;
985
+ padding: 48px 0;
986
+ text-align: center;
987
+ }
988
+
989
+ footer .footer-links {
990
+ display: flex;
991
+ justify-content: center;
992
+ gap: 32px;
993
+ margin-bottom: 20px;
994
+ flex-wrap: wrap;
995
+ }
996
+
997
+ footer .footer-links a {
998
+ color: #666;
999
+ font-size: 0.875rem;
1000
+ font-weight: 500;
1001
+ }
1002
+
1003
+ footer .footer-links a:hover {
1004
+ color: #76b900;
1005
+ }
1006
+
1007
+ footer .footer-note {
1008
+ font-size: 0.8rem;
1009
+ color: #444;
1010
+ line-height: 1.7;
1011
+ }
1012
+
1013
+ footer .footer-note .heart {
1014
+ color: #ff6b35;
1015
+ }
1016
+
1017
+ /* ===================== */
1018
+ /* RESPONSIVE */
1019
+ /* ===================== */
1020
+ @media (max-width: 768px) {
1021
+ section {
1022
+ padding: 72px 0;
1023
+ }
1024
+
1025
+ .section-title {
1026
+ font-size: 1.75rem;
1027
+ }
1028
+
1029
+ .features-grid {
1030
+ grid-template-columns: 1fr;
1031
+ gap: 16px;
1032
+ }
1033
+
1034
+ .security-grid {
1035
+ grid-template-columns: 1fr;
1036
+ gap: 16px;
1037
+ }
1038
+
1039
+ .features-grid {
1040
+ grid-template-columns: 1fr;
1041
+ }
1042
+
1043
+ .stat-boxes {
1044
+ grid-template-columns: repeat(2, 1fr);
1045
+ gap: 12px;
1046
+ }
1047
+
1048
+ .tools-groups {
1049
+ grid-template-columns: 1fr;
1050
+ gap: 16px;
1051
+ }
1052
+
1053
+ nav .nav-links {
1054
+ display: none;
1055
+ }
1056
+
1057
+ .hero {
1058
+ padding-top: 100px;
1059
+ min-height: auto;
1060
+ padding-bottom: 80px;
1061
+ }
1062
+
1063
+ .code-block code {
1064
+ font-size: 0.78rem;
1065
+ }
1066
+
1067
+ .arch-diagram pre {
1068
+ font-size: 0.7rem;
1069
+ }
1070
+
1071
+ .timeline {
1072
+ padding-left: 40px;
1073
+ }
1074
+
1075
+ .timeline::before {
1076
+ left: 11px;
1077
+ }
1078
+
1079
+ .timeline-dot {
1080
+ left: -37px;
1081
+ width: 20px;
1082
+ height: 20px;
1083
+ }
1084
+
1085
+ .timeline-dot::after {
1086
+ width: 6px;
1087
+ height: 6px;
1088
+ }
1089
+ }
1090
+
1091
+ @media (max-width: 1024px) and (min-width: 769px) {
1092
+ .features-grid {
1093
+ grid-template-columns: repeat(2, 1fr);
1094
+ }
1095
+
1096
+ .security-grid {
1097
+ grid-template-columns: repeat(2, 1fr);
1098
+ }
1099
+
1100
+ .tools-groups {
1101
+ grid-template-columns: repeat(2, 1fr);
1102
+ }
1103
+
1104
+ .tools-groups .tools-group:last-child {
1105
+ grid-column: 1 / -1;
1106
+ max-width: 50%;
1107
+ justify-self: center;
1108
+ }
1109
+ }
1110
+ </style>
1111
+ </head>
1112
+ <body>
1113
+
1114
+ <!-- Navigation -->
1115
+ <nav>
1116
+ <div class="container">
1117
+ <div class="logo"><img src="logo-hero.svg" alt="clawspark logo">clawspark</div>
1118
+ <ul class="nav-links">
1119
+ <li><a href="#features">Features</a></li>
1120
+ <li><a href="#security">Security</a></li>
1121
+ <li><a href="#architecture">Architecture</a></li>
1122
+ <li><a href="#hardware">Hardware</a></li>
1123
+ <li><a href="#how-it-works">How It Works</a></li>
1124
+ <li><a href="#install">Install</a></li>
1125
+ <li><a href="https://github.com/thanhan92-f1/clawspark" target="_blank" rel="noopener">GitHub</a></li>
1126
+ </ul>
1127
+ </div>
1128
+ </nav>
1129
+
1130
+ <!-- Hero -->
1131
+ <section class="hero">
1132
+ <div class="hero-content fade-in">
1133
+ <div class="hero-title">
1134
+ <img src="logo-hero.svg" alt="clawspark logo">
1135
+ <h1><span class="accent">claw</span>spark</h1>
1136
+ </div>
1137
+ <p class="tagline">One command. Private AI agent. Your hardware.</p>
1138
+ <p class="description">
1139
+ Turn your DGX Spark, RTX GPU, Mac, or Jetson into a private AI agent that can code, research, browse the web, analyze images, and run tasks. Everything runs locally. Your data never leaves your machine.
1140
+ </p>
1141
+ <div class="code-block">
1142
+ <div class="terminal-dots">
1143
+ <span></span><span></span><span></span>
1144
+ </div>
1145
+ <code><span class="prompt">$</span> curl -fsSL https://clawspark.hitechclaw.com/install.sh | bash</code>
1146
+ <button class="copy-btn" onclick="copyCommand(this)">Copy</button>
1147
+ </div>
1148
+ </div>
1149
+ </section>
1150
+
1151
+ <!-- What It Does -->
1152
+ <section class="features" id="features">
1153
+ <div class="container">
1154
+ <div class="fade-in">
1155
+ <h2 class="section-title">What Your Agent Can Do</h2>
1156
+ <p class="section-subtitle">Not just a chatbot. A full AI agent that writes code, browses the web, analyzes images, and runs tasks on your hardware.</p>
1157
+ </div>
1158
+ <div class="features-grid">
1159
+ <div class="feature-card fade-in">
1160
+ <div class="feature-icon">
1161
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg>
1162
+ </div>
1163
+ <h3>Write and Run Code</h3>
1164
+ <p>Ask it to build apps, scripts, or tools. It writes the code, tests it in a Docker sandbox, and iterates until it works.</p>
1165
+ </div>
1166
+ <div class="feature-card fade-in">
1167
+ <div class="feature-icon">
1168
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg>
1169
+ </div>
1170
+ <h3>Deep Research</h3>
1171
+ <p>Spawns parallel sub-agents that each research a subtopic, then merges everything into one report. Web search via DuckDuckGo, no API key needed.</p>
1172
+ </div>
1173
+ <div class="feature-card fade-in">
1174
+ <div class="feature-icon">
1175
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="3" width="20" height="14" rx="2" ry="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg>
1176
+ </div>
1177
+ <h3>Browser Automation</h3>
1178
+ <p>Headless Chromium built in. Navigate websites, fill forms, click buttons, take screenshots. All running locally.</p>
1179
+ </div>
1180
+ <div class="feature-card fade-in">
1181
+ <div class="feature-icon">
1182
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg>
1183
+ </div>
1184
+ <h3>Vision and Image Analysis</h3>
1185
+ <p>Send a screenshot, photo, or diagram. The vision model (qwen2.5-vl) analyzes it and describes what it sees. Multi-model support built in.</p>
1186
+ </div>
1187
+ <div class="feature-card fade-in">
1188
+ <div class="feature-icon">
1189
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z"/><path d="M19 10v2a7 7 0 0 1-14 0v-2"/><line x1="12" y1="19" x2="12" y2="23"/><line x1="8" y1="23" x2="16" y2="23"/></svg>
1190
+ </div>
1191
+ <h3>Voice Enabled</h3>
1192
+ <p>Send WhatsApp or Telegram voice notes. Whisper transcribes them locally on your GPU. No audio ever leaves your machine.</p>
1193
+ </div>
1194
+ <div class="feature-card fade-in">
1195
+ <div class="feature-icon">
1196
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="8" rx="2" ry="2"/><rect x="2" y="14" width="20" height="8" rx="2" ry="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg>
1197
+ </div>
1198
+ <h3>Docker Sandbox</h3>
1199
+ <p>Agent-generated code runs in isolated containers. No network, read-only root, all capabilities dropped, custom seccomp profile.</p>
1200
+ </div>
1201
+ <div class="feature-card fade-in">
1202
+ <div class="feature-icon">
1203
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="3"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
1204
+ </div>
1205
+ <h3>Sub-Agent Orchestration</h3>
1206
+ <p>Spawns background agents for parallel work. Up to 4 concurrent sub-agents with 2 levels of depth. Complex tasks broken into threads.</p>
1207
+ </div>
1208
+ <div class="feature-card fade-in">
1209
+ <div class="feature-icon">
1210
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
1211
+ </div>
1212
+ <h3>Skill Packs</h3>
1213
+ <p>Curated bundles for research, coding, productivity, and voice. Install a full skill pack with one command or pick individual skills.</p>
1214
+ </div>
1215
+ <div class="feature-card fade-in">
1216
+ <div class="feature-icon">
1217
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><path d="M8 13h2l2 3 4-6h2"/></svg>
1218
+ </div>
1219
+ <h3>Diagrams and Architecture</h3>
1220
+ <p>Ask for a flowchart, architecture diagram, or mindmap. MCP-powered Mermaid generates real PNG images from text. 20+ diagram types.</p>
1221
+ </div>
1222
+ <div class="feature-card fade-in">
1223
+ <div class="feature-icon">
1224
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
1225
+ </div>
1226
+ <h3>Survives Reboots</h3>
1227
+ <p>Systemd services auto-start everything on boot. Gateway, node host, dashboard, Ollama. No manual restarts, ever.</p>
1228
+ </div>
1229
+
1230
+ <div class="feature-card fade-in">
1231
+ <div class="feature-icon">
1232
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/><polyline points="16 17 21 12 16 7"/><line x1="21" y1="12" x2="9" y2="12"/></svg>
1233
+ </div>
1234
+ <h3>Skill Security Audit</h3>
1235
+ <p>Scans installed skills for malicious patterns: credential theft, network exfiltration, obfuscation. Protects against the 341+ malicious ClawHub skills found in the wild.</p>
1236
+ </div>
1237
+
1238
+ <div class="feature-card fade-in">
1239
+ <div class="feature-icon">
1240
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 12h-4l-3 9L9 3l-3 9H2"/></svg>
1241
+ </div>
1242
+ <h3>Built-in Diagnostics</h3>
1243
+ <p>Run <code style="font-family:'JetBrains Mono',monospace;font-size:0.82rem;color:#76b900;background:rgba(118,185,0,0.08);padding:1px 6px;border-radius:4px;">clawspark diagnose</code> for a full system health check: GPU, Ollama, OpenClaw, skills, ports, security, and logs. Shareable debug reports.</p>
1244
+ </div>
1245
+ </div>
1246
+ </div>
1247
+ </section>
1248
+
1249
+ <!-- Security -->
1250
+ <section class="security" id="security">
1251
+ <div class="container">
1252
+ <div class="fade-in">
1253
+ <h2 class="section-title">Security</h2>
1254
+ <p class="section-subtitle">Your AI runs on your hardware and stays locked down. Every layer is hardened by default.</p>
1255
+ </div>
1256
+ <div class="security-grid">
1257
+ <div class="security-item fade-in">
1258
+ <div class="security-icon">
1259
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg>
1260
+ </div>
1261
+ <div class="security-content">
1262
+ <h3>Localhost Only</h3>
1263
+ <p>Gateway binds to 127.0.0.1. Your AI is not accessible from the network.</p>
1264
+ </div>
1265
+ </div>
1266
+ <div class="security-item fade-in">
1267
+ <div class="security-icon">
1268
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg>
1269
+ </div>
1270
+ <div class="security-content">
1271
+ <h3>Token Authentication</h3>
1272
+ <p>Random 256-bit token generated at install. Every API call requires it.</p>
1273
+ </div>
1274
+ </div>
1275
+ <div class="security-item fade-in">
1276
+ <div class="security-icon">
1277
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="4.93" y1="4.93" x2="19.07" y2="19.07"/></svg>
1278
+ </div>
1279
+ <div class="security-content">
1280
+ <h3>Tool Restrictions</h3>
1281
+ <p>Dangerous tools (exec, write, browser, process) blocked by default. Bot cannot run commands on your machine.</p>
1282
+ </div>
1283
+ </div>
1284
+ <div class="security-item fade-in">
1285
+ <div class="security-icon">
1286
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="9" y1="15" x2="15" y2="15"/></svg>
1287
+ </div>
1288
+ <div class="security-content">
1289
+ <h3>Hardened Agent</h3>
1290
+ <p>SOUL.md and TOOLS.md are read-only. The AI cannot modify its own guardrails.</p>
1291
+ </div>
1292
+ </div>
1293
+ <div class="security-item fade-in">
1294
+ <div class="security-icon">
1295
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="1" y="4" width="22" height="16" rx="2" ry="2"/><line x1="1" y1="10" x2="23" y2="10"/></svg>
1296
+ </div>
1297
+ <div class="security-content">
1298
+ <h3>Firewall Rules</h3>
1299
+ <p>UFW configured automatically. Deny incoming, allow outgoing, SSH only.</p>
1300
+ </div>
1301
+ </div>
1302
+ <div class="security-item fade-in">
1303
+ <div class="security-icon">
1304
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="2" width="20" height="8" rx="2" ry="2"/><rect x="2" y="14" width="20" height="8" rx="2" ry="2"/><line x1="6" y1="6" x2="6.01" y2="6"/><line x1="6" y1="18" x2="6.01" y2="18"/></svg>
1305
+ </div>
1306
+ <div class="security-content">
1307
+ <h3>Docker Sandbox</h3>
1308
+ <p>Code execution isolated in containers: no network, read-only root, all capabilities dropped, custom seccomp profile, 200 PID limit.</p>
1309
+ </div>
1310
+ </div>
1311
+ <div class="security-item fade-in">
1312
+ <div class="security-icon">
1313
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg>
1314
+ </div>
1315
+ <div class="security-content">
1316
+ <h3>Skill Audit</h3>
1317
+ <p>Scans skills for 30+ malicious patterns (credential theft, exfiltration, obfuscation). Tracks file hashes to detect tampering. Curated allowlist of verified skills.</p>
1318
+ </div>
1319
+ </div>
1320
+ <div class="security-item fade-in">
1321
+ <div class="security-icon">
1322
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>
1323
+ </div>
1324
+ <div class="security-content">
1325
+ <h3>Air Gap Mode</h3>
1326
+ <p>Optional complete network isolation via <code style="font-family:'JetBrains Mono',monospace;font-size:0.82rem;color:#76b900;background:rgba(118,185,0,0.08);padding:1px 6px;border-radius:4px;">clawspark airgap on</code>. Zero outbound traffic.</p>
1327
+ </div>
1328
+ </div>
1329
+ </div>
1330
+ </div>
1331
+ </section>
1332
+
1333
+ <!-- Architecture -->
1334
+ <section class="architecture" id="architecture">
1335
+ <div class="container">
1336
+ <div class="fade-in">
1337
+ <h2 class="section-title">Architecture</h2>
1338
+ <p class="section-subtitle">A clean stack from messaging layer to GPU. Everything runs locally on a single machine.</p>
1339
+ </div>
1340
+ <div class="arch-visual fade-in">
1341
+ <div class="arch-layer">
1342
+ <span class="arch-layer-label">Channels</span>
1343
+ <div class="arch-node accent">
1344
+ <span class="arch-node-name">WhatsApp</span>
1345
+ <span class="arch-node-desc">Baileys</span>
1346
+ </div>
1347
+ <div class="arch-node accent">
1348
+ <span class="arch-node-name">Telegram</span>
1349
+ <span class="arch-node-desc">Bot API</span>
1350
+ </div>
1351
+ <div class="arch-node accent">
1352
+ <span class="arch-node-name">Web UI</span>
1353
+ <span class="arch-node-desc">:18789</span>
1354
+ </div>
1355
+ <div class="arch-node accent">
1356
+ <span class="arch-node-name">Voice</span>
1357
+ <span class="arch-node-desc">Whisper</span>
1358
+ </div>
1359
+ </div>
1360
+
1361
+ <div class="arch-arrow"></div>
1362
+
1363
+ <div class="arch-layer">
1364
+ <span class="arch-layer-label">Gateway</span>
1365
+ <div class="arch-node primary wide">
1366
+ <span class="arch-node-name">OpenClaw Gateway</span>
1367
+ <span class="arch-node-desc">Routing, auth, tool dispatch (port 18789)</span>
1368
+ </div>
1369
+ </div>
1370
+
1371
+ <div class="arch-arrow"></div>
1372
+
1373
+ <div class="arch-layer">
1374
+ <span class="arch-layer-label">Runtime</span>
1375
+ <div class="arch-node primary">
1376
+ <span class="arch-node-name">Agent</span>
1377
+ <span class="arch-node-desc">LLM reasoning</span>
1378
+ </div>
1379
+ <div class="arch-node">
1380
+ <span class="arch-node-name">Node Host</span>
1381
+ <span class="arch-node-desc">28+ tools</span>
1382
+ </div>
1383
+ <div class="arch-node">
1384
+ <span class="arch-node-name">Sub-Agents</span>
1385
+ <span class="arch-node-desc">Parallel tasks</span>
1386
+ </div>
1387
+ <div class="arch-node primary">
1388
+ <span class="arch-node-name">MCP Servers</span>
1389
+ <span class="arch-node-desc">Memory, Diagrams</span>
1390
+ </div>
1391
+ </div>
1392
+
1393
+ <div class="arch-arrow"></div>
1394
+
1395
+ <div class="arch-layer">
1396
+ <span class="arch-layer-label">Tools</span>
1397
+ <div class="arch-node">
1398
+ <span class="arch-node-name">exec</span>
1399
+ </div>
1400
+ <div class="arch-node">
1401
+ <span class="arch-node-name">browser</span>
1402
+ </div>
1403
+ <div class="arch-node">
1404
+ <span class="arch-node-name">read/write</span>
1405
+ </div>
1406
+ <div class="arch-node">
1407
+ <span class="arch-node-name">web_search</span>
1408
+ </div>
1409
+ <div class="arch-node">
1410
+ <span class="arch-node-name">vision</span>
1411
+ </div>
1412
+ <div class="arch-node accent">
1413
+ <span class="arch-node-name">Sandbox</span>
1414
+ <span class="arch-node-desc">Isolated Docker</span>
1415
+ </div>
1416
+ </div>
1417
+
1418
+ <div class="arch-arrow"></div>
1419
+
1420
+ <div class="arch-layer">
1421
+ <span class="arch-layer-label">Inference</span>
1422
+ <div class="arch-node primary">
1423
+ <span class="arch-node-name">Ollama</span>
1424
+ <span class="arch-node-desc">:11434</span>
1425
+ </div>
1426
+ <div class="arch-node primary">
1427
+ <span class="arch-node-name">Chat Model</span>
1428
+ <span class="arch-node-desc">Qwen 3.5 35B</span>
1429
+ </div>
1430
+ <div class="arch-node accent">
1431
+ <span class="arch-node-name">Vision Model</span>
1432
+ <span class="arch-node-desc">Qwen VL 7B</span>
1433
+ </div>
1434
+ <div class="arch-node">
1435
+ <span class="arch-node-name">GB10 GPU</span>
1436
+ <span class="arch-node-desc">128 GB unified</span>
1437
+ </div>
1438
+ </div>
1439
+ </div>
1440
+ <div class="stat-boxes">
1441
+ <div class="stat-box fade-in">
1442
+ <div class="stat-value">128 GB</div>
1443
+ <div class="stat-label">Unified Memory</div>
1444
+ </div>
1445
+ <div class="stat-box fade-in">
1446
+ <div class="stat-value">~59 tok/s</div>
1447
+ <div class="stat-label">Generation Speed</div>
1448
+ </div>
1449
+ <div class="stat-box fade-in">
1450
+ <div class="stat-value">1 PFLOP</div>
1451
+ <div class="stat-label">AI Compute</div>
1452
+ </div>
1453
+ <div class="stat-box fade-in">
1454
+ <div class="stat-value">28+ Tools</div>
1455
+ <div class="stat-label">Agent + MCP Tools</div>
1456
+ </div>
1457
+ </div>
1458
+ </div>
1459
+ </section>
1460
+
1461
+ <!-- Supported Hardware -->
1462
+ <section class="hardware" id="hardware">
1463
+ <div class="container">
1464
+ <div class="fade-in">
1465
+ <h2 class="section-title">Supported Hardware</h2>
1466
+ <p class="section-subtitle">clawspark automatically detects your hardware and selects the best model configuration.</p>
1467
+ </div>
1468
+ <div class="table-wrapper fade-in">
1469
+ <table>
1470
+ <thead>
1471
+ <tr>
1472
+ <th>Hardware</th>
1473
+ <th>Memory</th>
1474
+ <th>Default Model</th>
1475
+ <th>Status</th>
1476
+ </tr>
1477
+ </thead>
1478
+ <tbody>
1479
+ <tr>
1480
+ <td class="hw-name">NVIDIA DGX Spark</td>
1481
+ <td class="hw-vram">128 GB unified</td>
1482
+ <td>Qwen 3.5 35B-A3B</td>
1483
+ <td class="hw-perf perf-excellent">~59 tok/s (tested)</td>
1484
+ </tr>
1485
+ <tr>
1486
+ <td class="hw-name">Mac M1 / M2 / M3 / M4</td>
1487
+ <td class="hw-vram">16-128 GB unified</td>
1488
+ <td>llmfit-selected</td>
1489
+ <td class="hw-perf perf-great">untested</td>
1490
+ </tr>
1491
+ <tr>
1492
+ <td class="hw-name">RTX 5090 / 4090</td>
1493
+ <td class="hw-vram">24-32 GB VRAM</td>
1494
+ <td>llmfit-selected</td>
1495
+ <td class="hw-perf perf-great">untested</td>
1496
+ </tr>
1497
+ <tr>
1498
+ <td class="hw-name">RTX 4080 / 4070</td>
1499
+ <td class="hw-vram">8-16 GB VRAM</td>
1500
+ <td>llmfit-selected</td>
1501
+ <td class="hw-perf perf-good">untested</td>
1502
+ </tr>
1503
+ <tr>
1504
+ <td class="hw-name">Jetson AGX Orin / Thor</td>
1505
+ <td class="hw-vram">64-128 GB unified</td>
1506
+ <td>llmfit-selected</td>
1507
+ <td class="hw-perf perf-great">untested</td>
1508
+ </tr>
1509
+ </tbody>
1510
+ </table>
1511
+ <p style="color:#888;font-size:0.85rem;margin-top:12px;text-align:center;">DGX Spark is the only platform with full end-to-end testing. Other platforms should work -- community testing welcome.</p>
1512
+ </div>
1513
+ </div>
1514
+ </section>
1515
+
1516
+ <!-- How It Works -->
1517
+ <section class="how-it-works" id="how-it-works">
1518
+ <div class="container">
1519
+ <div class="fade-in">
1520
+ <h2 class="section-title">How It Works</h2>
1521
+ <p class="section-subtitle">From bare hardware to a fully capable AI agent in about 5 minutes.</p>
1522
+ </div>
1523
+ <div class="timeline">
1524
+ <div class="timeline-step fade-in">
1525
+ <div class="timeline-dot"></div>
1526
+ <span class="step-label">Step 1</span>
1527
+ <h4>Detect Hardware</h4>
1528
+ <p>Scans for GPUs, identifies your hardware model, and measures available VRAM or unified memory.</p>
1529
+ </div>
1530
+ <div class="timeline-step fade-in">
1531
+ <div class="timeline-dot"></div>
1532
+ <span class="step-label">Step 2</span>
1533
+ <h4>Pick the Best Model</h4>
1534
+ <p>Uses llmfit to select the optimal chat model for your hardware. Pulls a vision model automatically for image analysis.</p>
1535
+ </div>
1536
+ <div class="timeline-step fade-in">
1537
+ <div class="timeline-dot"></div>
1538
+ <span class="step-label">Step 3</span>
1539
+ <h4>Install Everything</h4>
1540
+ <p>Ollama, OpenClaw, skills, Whisper for voice, Chromium for browser automation. All handled automatically.</p>
1541
+ </div>
1542
+ <div class="timeline-step fade-in">
1543
+ <div class="timeline-dot"></div>
1544
+ <span class="step-label">Step 4</span>
1545
+ <h4>Set Up Sandbox</h4>
1546
+ <p>Installs Docker if needed, builds an isolated container image with seccomp, no-network, and read-only rootfs for safe code execution.</p>
1547
+ </div>
1548
+ <div class="timeline-step fade-in">
1549
+ <div class="timeline-dot"></div>
1550
+ <span class="step-label">Step 5</span>
1551
+ <h4>Create Services</h4>
1552
+ <p>Systemd services for gateway, node host, and dashboard. Everything auto-starts on boot and restarts on failure.</p>
1553
+ </div>
1554
+ <div class="timeline-step fade-in">
1555
+ <div class="timeline-dot"></div>
1556
+ <span class="step-label">Step 6</span>
1557
+ <h4>Harden Security</h4>
1558
+ <p>Firewall rules, auth tokens, localhost binding, read-only guardrails. Your agent is locked down by default.</p>
1559
+ </div>
1560
+ <div class="timeline-step fade-in">
1561
+ <div class="timeline-dot"></div>
1562
+ <span class="step-label">Done</span>
1563
+ <h4>Agent Ready</h4>
1564
+ <p>Your private AI agent is live. Code, research, browse, analyze images, run tasks. All on your hardware, all private.</p>
1565
+ </div>
1566
+ </div>
1567
+ </div>
1568
+ </section>
1569
+
1570
+ <!-- Tools Installed -->
1571
+ <section class="tools-section" id="tools">
1572
+ <div class="container">
1573
+ <div class="fade-in">
1574
+ <h2 class="section-title">Tools Installed</h2>
1575
+ <p class="section-subtitle">26+ agent tools, 10 skills, and a full management CLI ship with every clawspark installation.</p>
1576
+ </div>
1577
+ <div class="tools-groups">
1578
+ <div class="tools-group fade-in">
1579
+ <div class="tools-group-header">
1580
+ <div class="tools-group-icon green">
1581
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>
1582
+ </div>
1583
+ <h3>Agent Skills</h3>
1584
+ </div>
1585
+ <ul class="tools-list">
1586
+ <li>
1587
+ <span class="tool-bullet green"></span>
1588
+ <span><span class="tool-name">Web Search</span> <span class="tool-desc">-- DuckDuckGo, no API key needed</span></span>
1589
+ </li>
1590
+ <li>
1591
+ <span class="tool-bullet green"></span>
1592
+ <span><span class="tool-name">Deep Research</span> <span class="tool-desc">-- Multi-source synthesis</span></span>
1593
+ </li>
1594
+ <li>
1595
+ <span class="tool-bullet green"></span>
1596
+ <span><span class="tool-name">Voice Transcription</span> <span class="tool-desc">-- Local Whisper on GPU</span></span>
1597
+ </li>
1598
+ <li>
1599
+ <span class="tool-bullet green"></span>
1600
+ <span><span class="tool-name">Prompt Guard</span> <span class="tool-desc">-- Injection defense</span></span>
1601
+ </li>
1602
+ </ul>
1603
+ </div>
1604
+ <div class="tools-group fade-in">
1605
+ <div class="tools-group-header">
1606
+ <div class="tools-group-icon orange">
1607
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg>
1608
+ </div>
1609
+ <h3>Agent Tools <span style="font-size:0.7em;color:#888;font-weight:400">(26+ tools, work out of the box)</span></h3>
1610
+ </div>
1611
+ <ul class="tools-list scrollable">
1612
+ <li>
1613
+ <span class="tool-bullet orange"></span>
1614
+ <span><span class="tool-cmd">exec</span> <span class="tool-desc">-- Shell commands (bash, docker, kubectl)</span></span>
1615
+ </li>
1616
+ <li>
1617
+ <span class="tool-bullet orange"></span>
1618
+ <span><span class="tool-cmd">web_fetch</span> <span class="tool-desc">-- HTTP requests, API calls, web search via DDG</span></span>
1619
+ </li>
1620
+ <li>
1621
+ <span class="tool-bullet orange"></span>
1622
+ <span><span class="tool-cmd">read</span> <span class="tool-desc">-- Read files on the host</span></span>
1623
+ </li>
1624
+ <li>
1625
+ <span class="tool-bullet orange"></span>
1626
+ <span><span class="tool-cmd">write</span> <span class="tool-desc">-- Write and create files</span></span>
1627
+ </li>
1628
+ <li>
1629
+ <span class="tool-bullet orange"></span>
1630
+ <span><span class="tool-cmd">edit</span> <span class="tool-desc">-- Edit files in place</span></span>
1631
+ </li>
1632
+ <li>
1633
+ <span class="tool-bullet orange"></span>
1634
+ <span><span class="tool-cmd">message</span> <span class="tool-desc">-- WhatsApp / Telegram replies</span></span>
1635
+ </li>
1636
+ <li>
1637
+ <span class="tool-bullet orange"></span>
1638
+ <span><span class="tool-cmd">canvas</span> <span class="tool-desc">-- Interactive web UI</span></span>
1639
+ </li>
1640
+ <li>
1641
+ <span class="tool-bullet orange"></span>
1642
+ <span><span class="tool-cmd">process</span> <span class="tool-desc">-- List, monitor, kill processes</span></span>
1643
+ </li>
1644
+ <li>
1645
+ <span class="tool-bullet orange"></span>
1646
+ <span><span class="tool-cmd">cron</span> <span class="tool-desc">-- Scheduled tasks</span></span>
1647
+ </li>
1648
+ <li>
1649
+ <span class="tool-bullet orange"></span>
1650
+ <span><span class="tool-cmd">nodes</span> <span class="tool-desc">-- Remote node execution (paired devices)</span></span>
1651
+ </li>
1652
+ <li>
1653
+ <span class="tool-bullet orange"></span>
1654
+ <span><span class="tool-cmd">memory_search</span> <span class="tool-desc">-- Search stored context</span></span>
1655
+ </li>
1656
+ <li>
1657
+ <span class="tool-bullet orange"></span>
1658
+ <span><span class="tool-cmd">memory_store</span> <span class="tool-desc">-- Save info across sessions</span></span>
1659
+ </li>
1660
+ <li>
1661
+ <span class="tool-bullet orange"></span>
1662
+ <span><span class="tool-cmd">transcribe</span> <span class="tool-desc">-- Audio/voice transcription (local Whisper)</span></span>
1663
+ </li>
1664
+ <li>
1665
+ <span class="tool-bullet orange"></span>
1666
+ <span><span class="tool-cmd">vision</span> <span class="tool-desc">-- Image analysis (qwen2.5-vl)</span></span>
1667
+ </li>
1668
+ <li>
1669
+ <span class="tool-bullet orange"></span>
1670
+ <span><span class="tool-cmd">browser</span> <span class="tool-desc">-- Navigate websites, click, fill forms, screenshot</span></span>
1671
+ </li>
1672
+ <li>
1673
+ <span class="tool-bullet orange"></span>
1674
+ <span><span class="tool-cmd">web_search</span> <span class="tool-desc">-- DuckDuckGo search, no API key</span></span>
1675
+ </li>
1676
+ <li>
1677
+ <span class="tool-bullet orange"></span>
1678
+ <span><span class="tool-cmd">image</span> <span class="tool-desc">-- Download and process images</span></span>
1679
+ </li>
1680
+ <li>
1681
+ <span class="tool-bullet orange"></span>
1682
+ <span><span class="tool-cmd">pdf</span> <span class="tool-desc">-- Read and extract PDF content</span></span>
1683
+ </li>
1684
+ <li>
1685
+ <span class="tool-bullet orange"></span>
1686
+ <span><span class="tool-cmd">sessions_spawn</span> <span class="tool-desc">-- Sub-agent sessions for parallel work</span></span>
1687
+ </li>
1688
+ </ul>
1689
+ <div class="tools-scroll-hint">Scroll for all tools</div>
1690
+ </div>
1691
+ <div class="tools-group fade-in">
1692
+ <div class="tools-group-header">
1693
+ <div class="tools-group-icon grey">
1694
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"/><line x1="12" y1="19" x2="20" y2="19"/></svg>
1695
+ </div>
1696
+ <h3>Management CLI</h3>
1697
+ </div>
1698
+ <ul class="tools-list scrollable">
1699
+ <li>
1700
+ <span class="tool-bullet grey"></span>
1701
+ <span><span class="tool-cmd">clawspark status</span> <span class="tool-desc">-- Check all components</span></span>
1702
+ </li>
1703
+ <li>
1704
+ <span class="tool-bullet grey"></span>
1705
+ <span><span class="tool-cmd">clawspark start</span> <span class="tool-desc">-- Start all services</span></span>
1706
+ </li>
1707
+ <li>
1708
+ <span class="tool-bullet grey"></span>
1709
+ <span><span class="tool-cmd">clawspark stop</span> <span class="tool-desc">-- Stop all services</span></span>
1710
+ </li>
1711
+ <li>
1712
+ <span class="tool-bullet grey"></span>
1713
+ <span><span class="tool-cmd">clawspark restart</span> <span class="tool-desc">-- Restart services</span></span>
1714
+ </li>
1715
+ <li>
1716
+ <span class="tool-bullet grey"></span>
1717
+ <span><span class="tool-cmd">clawspark model list</span> <span class="tool-desc">-- Show all models</span></span>
1718
+ </li>
1719
+ <li>
1720
+ <span class="tool-bullet grey"></span>
1721
+ <span><span class="tool-cmd">clawspark model switch</span> <span class="tool-desc">-- Change chat model</span></span>
1722
+ </li>
1723
+ <li>
1724
+ <span class="tool-bullet grey"></span>
1725
+ <span><span class="tool-cmd">clawspark sandbox on</span> <span class="tool-desc">-- Enable Docker sandbox</span></span>
1726
+ </li>
1727
+ <li>
1728
+ <span class="tool-bullet grey"></span>
1729
+ <span><span class="tool-cmd">clawspark skills pack</span> <span class="tool-desc">-- Install skill bundles</span></span>
1730
+ </li>
1731
+ <li>
1732
+ <span class="tool-bullet grey"></span>
1733
+ <span><span class="tool-cmd">clawspark logs</span> <span class="tool-desc">-- View logs</span></span>
1734
+ </li>
1735
+ </ul>
1736
+ </div>
1737
+ </div>
1738
+ </div>
1739
+ </section>
1740
+
1741
+ <!-- The Install -->
1742
+ <section class="install-section" id="install">
1743
+ <div class="container">
1744
+ <div class="fade-in">
1745
+ <h2 class="section-title">Get Started</h2>
1746
+ <p class="section-subtitle" style="margin-left:auto;margin-right:auto;">One command is all it takes. Run it on any supported machine.</p>
1747
+ </div>
1748
+ <div class="code-block fade-in" style="margin-bottom: 24px;">
1749
+ <div class="terminal-dots">
1750
+ <span></span><span></span><span></span>
1751
+ </div>
1752
+ <code><span class="prompt">$</span> curl -fsSL https://clawspark.hitechclaw.com/install.sh | bash</code>
1753
+ <button class="copy-btn" onclick="copyCommand(this)">Copy</button>
1754
+ </div>
1755
+ <p class="fade-in" style="color:#555;font-size:0.85rem;text-align:center;">Works on DGX Spark, RTX GPUs (Linux + CUDA), Mac (Apple Silicon), and Jetson. Fully tested on DGX Spark.</p>
1756
+ </div>
1757
+ </section>
1758
+
1759
+ <!-- Footer -->
1760
+ <footer>
1761
+ <div class="container">
1762
+ <div class="footer-links">
1763
+ <a href="https://github.com/thanhan92-f1/clawspark" target="_blank" rel="noopener">GitHub</a>
1764
+ <a href="#features">Features</a>
1765
+ <a href="#security">Security</a>
1766
+ <a href="#architecture">Architecture</a>
1767
+ <a href="#hardware">Hardware</a>
1768
+ <a href="#how-it-works">How It Works</a>
1769
+ </div>
1770
+ <p class="footer-note">
1771
+ Built <span class="heart">with care</span> for the OpenClaw community.<br>
1772
+ MIT License. Free and open source, forever.
1773
+ </p>
1774
+ </div>
1775
+ </footer>
1776
+
1777
+ <script>
1778
+ // Copy command to clipboard
1779
+ function copyCommand(btn) {
1780
+ var command = 'curl -fsSL https://clawspark.hitechclaw.com/install.sh | bash';
1781
+ navigator.clipboard.writeText(command).then(function() {
1782
+ btn.textContent = 'Copied!';
1783
+ btn.classList.add('copied');
1784
+ setTimeout(function() {
1785
+ btn.textContent = 'Copy';
1786
+ btn.classList.remove('copied');
1787
+ }, 2000);
1788
+ }).catch(function() {
1789
+ // Fallback for older browsers
1790
+ var textarea = document.createElement('textarea');
1791
+ textarea.value = command;
1792
+ textarea.style.position = 'fixed';
1793
+ textarea.style.opacity = '0';
1794
+ document.body.appendChild(textarea);
1795
+ textarea.select();
1796
+ document.execCommand('copy');
1797
+ document.body.removeChild(textarea);
1798
+ btn.textContent = 'Copied!';
1799
+ btn.classList.add('copied');
1800
+ setTimeout(function() {
1801
+ btn.textContent = 'Copy';
1802
+ btn.classList.remove('copied');
1803
+ }, 2000);
1804
+ });
1805
+ }
1806
+
1807
+ // Fade-in on scroll using IntersectionObserver
1808
+ (function() {
1809
+ var elements = document.querySelectorAll('.fade-in');
1810
+ if ('IntersectionObserver' in window) {
1811
+ var observer = new IntersectionObserver(function(entries) {
1812
+ entries.forEach(function(entry) {
1813
+ if (entry.isIntersecting) {
1814
+ entry.target.classList.add('visible');
1815
+ observer.unobserve(entry.target);
1816
+ }
1817
+ });
1818
+ }, {
1819
+ threshold: 0.1,
1820
+ rootMargin: '0px 0px -40px 0px'
1821
+ });
1822
+ elements.forEach(function(el) {
1823
+ observer.observe(el);
1824
+ });
1825
+ } else {
1826
+ // Fallback: just show everything
1827
+ elements.forEach(function(el) {
1828
+ el.classList.add('visible');
1829
+ });
1830
+ }
1831
+ })();
1832
+ </script>
1833
+
1834
+ </body>
1835
+ </html>