-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
1612 lines (1555 loc) · 175 KB
/
Copy pathindex.html
File metadata and controls
1612 lines (1555 loc) · 175 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
<title>captKernel — I build with AI</title>
<meta name="description" content="captKernel is the studio of Karan Parmar — a solo AI builder shipping autonomous agents, developer tools, and the products that grow out of them, in the open." />
<link rel="canonical" href="https://captkernel.com/" />
<meta property="og:type" content="website" />
<meta property="og:title" content="captKernel — I build with AI" />
<meta property="og:description" content="Solo AI studio — autonomous agents, developer tools, building in the open." />
<meta property="og:url" content="https://captkernel.com/" />
<meta name="theme-color" content="#0a0d0b" />
<meta name="twitter:card" content="summary" />
<meta name="twitter:title" content="captKernel — I build with AI" />
<meta name="twitter:description" content="Solo AI studio — autonomous agents, developer tools, building in the open." />
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='6' fill='%230a0d0b'/%3E%3Ctext x='4.5' y='23' font-family='monospace' font-size='18' fill='%2346d17a'%3E%3E_%3C/text%3E%3C/svg%3E" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;700;800&family=Space+Grotesk:wght@500;700&family=Bricolage+Grotesque:opsz,wght@12..96,700;12..96,800&family=Archivo:wght@700;900&family=Instrument+Serif&family=Syne:wght@700;800&display=swap" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<style>
:root{
--bg:#0a0d0b; --win:#0f1411; --winhdr:#121912; --border:#1d2922; --border-active:#2f7d4f;
--text:#dde5df; --muted:#7e8c84; --faint:#535e57; --accent:#46d17a; --accent-dim:#2f7d4f;
--red:#e06c75; --yellow:#e5c07b; --blue:#61afef;
--sans:'Inter',system-ui,-apple-system,sans-serif; --mono:'JetBrains Mono',monospace;
}
*{box-sizing:border-box;margin:0;padding:0;}
html,body{height:100%;}
body{background:var(--bg);
color:var(--text);font-family:var(--sans);-webkit-font-smoothing:antialiased;overflow:hidden;}
::selection{background:var(--accent);color:#062012;}
a{color:inherit;text-decoration:none;}
#desktop{position:fixed;left:0;right:0;top:0;bottom:88px;overflow:hidden;}
.hint{position:absolute;top:10px;left:14px;font-family:var(--mono);font-size:.7rem;color:var(--faint);z-index:1;pointer-events:none;}
.snap{position:absolute;background:rgba(70,209,122,.10);border:1.5px solid var(--accent);border-radius:12px;opacity:0;transition:all .12s ease;pointer-events:none;z-index:9999;}
/* ---- window ---- */
.win{position:absolute;display:flex;flex-direction:column;background:var(--win);border:1px solid var(--border);border-radius:11px;
overflow:hidden;box-shadow:0 20px 50px rgba(0,0,0,.4);
transition:left .3s cubic-bezier(.2,.8,.2,1),top .3s cubic-bezier(.2,.8,.2,1),width .3s cubic-bezier(.2,.8,.2,1),height .3s cubic-bezier(.2,.8,.2,1),box-shadow .2s,filter .2s,opacity .2s;
container-type:inline-size;}
.win.drag,.win.size{transition:box-shadow .2s;user-select:none;}
.win.float{box-shadow:0 30px 80px rgba(0,0,0,.6);}
/* not-focused windows recede a touch; focused one is clearly highlighted */
.win:not(.focused){filter:brightness(.9) saturate(.9);}
.win.focused{filter:none;border-color:var(--border-active);box-shadow:0 0 0 1px var(--accent),0 26px 72px rgba(0,0,0,.62);}
.win.focused .wbar{background:linear-gradient(90deg,rgba(70,209,122,.14),var(--winhdr) 42%);}
.win.focused .wbar .ic,.win.focused .wbar .name{color:var(--accent);}
.win.opening{animation:winopen .32s cubic-bezier(.2,.85,.25,1);}
@keyframes winopen{0%{opacity:0;transform:translateY(40px) scale(.94);}100%{opacity:1;transform:none;}}
.win.closing{opacity:0;transform:scale(.9) translateY(20px);transition:opacity .2s,transform .2s;}
.win.minimizing{opacity:0;transform:translateY(60vh) scale(.2);transition:opacity .28s,transform .28s cubic-bezier(.4,0,.6,1);}
.wbar{display:flex;align-items:center;height:34px;padding:0 .5rem 0 .85rem;background:var(--winhdr);border-bottom:1px solid var(--border);
font-family:var(--mono);font-size:.72rem;color:var(--muted);gap:.5rem;cursor:grab;flex:none;}
.wbar:active{cursor:grabbing;}
.wbar .ic{color:var(--accent);} .wbar .name{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.wbar .ctrls{margin-left:auto;display:flex;gap:.25rem;}
.wbar .ctrls span{width:20px;height:20px;display:flex;align-items:center;justify-content:center;border-radius:5px;font-size:.72rem;color:var(--faint);cursor:pointer;transition:.13s;}
.wbar .ctrls span:hover{background:rgba(255,255,255,.07);color:var(--text);}
.wbar .ctrls .c-x:hover{background:var(--red);color:#1a0e0e;}
.wbody{flex:1;min-height:0;min-width:0;overflow:auto;}
/* 8-way resize grips */
.g{position:absolute;z-index:4;}
.g-n{top:-3px;left:10px;right:10px;height:8px;cursor:ns-resize;}
.g-s{bottom:-3px;left:10px;right:10px;height:8px;cursor:ns-resize;}
.g-e{right:-3px;top:10px;bottom:10px;width:8px;cursor:ew-resize;}
.g-w{left:-3px;top:10px;bottom:10px;width:8px;cursor:ew-resize;}
.g-ne{top:-4px;right:-4px;width:16px;height:16px;cursor:nesw-resize;}
.g-nw{top:-4px;left:-4px;width:16px;height:16px;cursor:nwse-resize;}
.g-sw{bottom:-4px;left:-4px;width:16px;height:16px;cursor:nesw-resize;}
.g-se{bottom:-4px;right:-4px;width:16px;height:16px;cursor:nwse-resize;}
.g-se::after{content:"";position:absolute;right:3px;bottom:3px;width:7px;height:7px;border-right:2px solid var(--faint);border-bottom:2px solid var(--faint);border-radius:1px;}
/* ---- content styles ---- */
.w-hero .wbody{padding:clamp(1.1rem,3cqw,2.3rem) clamp(1.1rem,3cqw,1.9rem);}
.w-hero .eyebrow{font-family:var(--mono);font-size:.78rem;color:var(--accent);margin-bottom:1rem;}
.w-hero h1{font-weight:800;font-size:clamp(1.7rem,8cqw,4rem);line-height:.98;letter-spacing:-2px;overflow-wrap:break-word;}
.w-hero h1 .ai{color:var(--accent);}
.w-hero .sub{margin-top:1.1rem;color:var(--muted);font-size:clamp(.85rem,2.4cqw,1rem);line-height:1.6;max-width:52ch;}
.w-hero .ctas{margin-top:1.5rem;display:flex;gap:.6rem;flex-wrap:wrap;}
.w-hero .btn{font-weight:600;font-size:.88rem;padding:.55rem 1.05rem;border-radius:8px;border:1px solid var(--border-active);color:var(--text);cursor:pointer;transition:.15s;}
.w-hero .btn.primary{background:var(--accent);color:#062012;border-color:var(--accent);font-weight:700;}
.w-hero .btn.primary:hover{background:#5be08c;} .w-hero .btn.ghost:hover{background:rgba(70,209,122,.1);}
.w-term .wbody{padding:.85rem 1rem;font-family:var(--mono);font-size:.82rem;line-height:1.8;cursor:text;}
.termout .ln{white-space:pre-wrap;word-break:break-word;}
.termout .p{color:var(--accent);} .termout .o{color:var(--muted);} .termout .hl{color:var(--text);} .termout .er{color:var(--red);} .termout .cy{color:var(--blue);} .termout .yw{color:var(--yellow);}
.terminline{display:flex;align-items:center;} .terminline .p{color:var(--accent);margin-right:.5rem;}
.terminline input{flex:1;min-width:0;background:transparent;border:none;outline:none;color:var(--text);font-family:var(--mono);font-size:.82rem;caret-color:var(--accent);}
.w-fetch .wbody{padding:1.2rem 1.3rem;font-family:var(--mono);}
.w-fetch pre.logo{color:var(--accent);font-size:clamp(.55rem,2.4cqw,.72rem);line-height:1.05;margin-bottom:.9rem;}
.w-fetch .ident{color:var(--accent);font-weight:700;font-size:.84rem;} .w-fetch .rule{color:var(--faint);font-size:.8rem;margin:.1rem 0 .6rem;}
.w-fetch .info{font-size:.79rem;line-height:1.9;} .w-fetch .info .k{color:var(--accent);display:inline-block;width:70px;} .w-fetch .info .v{color:var(--text);}
.w-fetch .palette{display:flex;gap:5px;margin-top:.9rem;} .w-fetch .palette i{width:16px;height:16px;border-radius:4px;display:block;}
/* ---- About window ---- */
.w-about .wbody{padding:1.1rem 1.3rem;font-family:var(--sans);overflow:auto;}
.w-about .ab-id{display:flex;align-items:baseline;gap:.55rem;flex-wrap:wrap;}
.w-about .ab-nm{font-size:1.25rem;font-weight:700;color:var(--text);letter-spacing:-.01em;}
.w-about .ab-hn{font-family:var(--mono);font-size:.78rem;color:var(--accent);} .w-about .ab-hn::before{content:"@";opacity:.6;}
.w-about .ab-role{font-size:.9rem;color:var(--text);margin-top:.2rem;}
.w-about .ab-meta{font-family:var(--mono);font-size:.7rem;color:var(--faint);margin-top:.28rem;}
.w-about .ab-bio{font-size:.84rem;line-height:1.62;color:var(--muted);margin:.9rem 0;}
.w-about .ab-bet{border:1px solid var(--border);border-left:2px solid var(--accent);border-radius:0 8px 8px 0;background:rgba(70,209,122,.05);padding:.6rem .8rem;margin:.9rem 0;font-family:var(--mono);}
.w-about .ab-bet .cm{color:var(--faint);font-size:.72rem;}
.w-about .ab-bet .big{color:var(--text);font-family:var(--sans);font-size:.94rem;line-height:1.5;font-weight:500;margin-top:.3rem;} .w-about .ab-bet .big b,.w-about .ab-bet .big .vg{color:var(--accent);font-weight:600;}
.w-about .vcur{display:inline-block;width:.5em;height:1.05em;background:var(--accent);vertical-align:-2px;margin-left:1px;animation:vblink 1.05s steps(1) infinite;} @keyframes vblink{50%{opacity:0;}}
.w-about .ab-h{font-family:var(--mono);font-size:.62rem;text-transform:uppercase;letter-spacing:.5px;color:var(--faint);margin:.2rem 0 .5rem;}
.w-about .ab-row{margin-bottom:.55rem;} .w-about .ab-row b{display:block;font-size:.82rem;color:var(--text);font-weight:600;} .w-about .ab-row span{font-family:var(--mono);font-size:.7rem;color:var(--muted);line-height:1.4;}
.w-about .ab-now{display:flex;align-items:center;gap:.45rem;font-family:var(--mono);font-size:.74rem;color:var(--muted);margin-top:.7rem;border-top:1px solid var(--border);padding-top:.7rem;}
.w-about .ab-now .dot{width:7px;height:7px;border-radius:50%;background:var(--accent);box-shadow:0 0 6px var(--accent);flex:none;}
body.macos .w-about .ab-hn,body.macos .w-about .ab-bet .big .vg{color:#2997ff;} body.macos .w-about .ab-bet{border-left-color:#2997ff;background:rgba(10,132,255,.06);} body.macos .w-about .vcur,body.macos .w-about .ab-now .dot{background:#2997ff;box-shadow:0 0 6px #2997ff;}
.w-work .wbody{font-family:var(--mono);}
.w-work .note{padding:.5rem 1rem;font-size:.68rem;color:var(--yellow);border-bottom:1px solid var(--border);background:rgba(229,192,123,.05);}
.w-work .fhead,.w-work .frow{display:grid;grid-template-columns:34px 1.4fr 110px 72px 64px;align-items:center;gap:.3rem;}
.w-work .fhead{padding:.5rem 1rem;font-size:.64rem;text-transform:uppercase;letter-spacing:.5px;color:var(--faint);border-bottom:1px solid var(--border);position:sticky;top:0;background:var(--win);}
.w-work .frow{padding:.6rem 1rem;border-bottom:1px solid var(--border);font-size:.82rem;cursor:pointer;}
.w-work .frow:hover{background:rgba(70,209,122,.06);}
.w-work .no{color:var(--accent);font-size:.72rem;} .w-work .nm{font-weight:600;color:var(--text);}
.w-work .ty{color:var(--muted);font-size:.72rem;}
.w-work .src{font-size:.62rem;text-transform:uppercase;} .w-work .src.gh{color:var(--accent);} .w-work .src.local{color:var(--blue);} .w-work .src.work{color:var(--yellow);}
.w-work .st{font-size:.62rem;text-transform:uppercase;color:var(--faint);text-align:right;} .w-work .st.live{color:var(--accent);}
/* ---- featured "shipped" band ---- */
.w-work .work-feat{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;padding:.7rem 1rem;border-bottom:1px solid var(--border);}
.w-work .feat-cap{grid-column:1/-1;display:flex;align-items:center;gap:.45rem;font-size:.6rem;text-transform:uppercase;letter-spacing:.7px;color:var(--faint);}
.w-work .feat-cap b{color:var(--accent);font-weight:700;}
.w-work .feat-card{border:1px solid var(--border);border-radius:8px;padding:.6rem .65rem;background:linear-gradient(180deg,rgba(70,209,122,.05),rgba(70,209,122,0));cursor:pointer;transition:transform .14s ease,border-color .14s ease,box-shadow .14s ease;display:flex;flex-direction:column;gap:.4rem;}
.w-work .feat-card:hover{transform:translateY(-2px);border-color:var(--accent);box-shadow:0 8px 24px -14px rgba(70,209,122,.55);}
.w-work .feat-top{display:flex;align-items:center;gap:.45rem;}
.w-work .feat-ico{font-size:1rem;line-height:1;display:flex;align-items:center;}
.w-work .feat-ico svg{display:block;}
.w-work .det-head h3 svg{vertical-align:middle;margin-right:.15rem;}
.w-work .feat-nm{font-weight:700;color:var(--text);font-size:.92rem;letter-spacing:.2px;}
.w-work .feat-badge{margin-left:auto;font-size:.54rem;text-transform:uppercase;letter-spacing:.4px;color:var(--accent);border:1px solid rgba(70,209,122,.4);border-radius:99px;padding:.08rem .42rem;white-space:nowrap;}
.w-work .feat-tag{font-size:.74rem;color:var(--muted);line-height:1.32;}
.w-work .feat-chips{display:flex;flex-wrap:wrap;gap:.25rem;}
.w-work .feat-chips span{font-size:.56rem;font-family:var(--mono);color:var(--faint);border:1px solid var(--border);border-radius:4px;padding:.06rem .32rem;}
.w-work .feat-cta{display:flex;gap:.35rem;margin-top:.1rem;}
.w-work .feat-cta a{flex:1;text-align:center;font-size:.63rem;font-weight:600;padding:.32rem .3rem;border-radius:5px;text-decoration:none;border:1px solid var(--border);transition:.12s;white-space:nowrap;}
.w-work .feat-cta a.primary{background:var(--accent);color:#04130b;border-color:var(--accent);}
.w-work .feat-cta a.primary:hover{filter:brightness(1.08);}
.w-work .feat-cta a.ghost{color:var(--accent);} .w-work .feat-cta a.ghost:hover{background:rgba(70,209,122,.1);}
/* ---- in-window detail view ---- */
.w-work .feat-back{display:inline-flex;align-items:center;gap:.3rem;margin:.6rem 1rem .1rem;font-size:.66rem;color:var(--accent);cursor:pointer;background:none;border:none;font-family:inherit;}
.w-work .feat-back:hover{text-decoration:underline;}
.w-work .det-head{padding:.3rem 1rem .4rem;}
.w-work .det-head h3{margin:0;font-size:1.12rem;color:var(--text);display:flex;align-items:center;gap:.45rem;}
.w-work .det-head h3 .feat-badge{font-size:.56rem;}
.w-work .det-tag{font-size:.78rem;color:var(--muted);margin-top:.25rem;}
.w-work .det-pitch{padding:0 1rem .55rem;font-size:.8rem;color:var(--text);line-height:1.5;opacity:.92;}
.w-work .det-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.6rem;padding:0 1rem .4rem;}
.w-work .det-col h4{margin:0 0 .35rem;font-size:.62rem;text-transform:uppercase;letter-spacing:.4px;color:var(--accent);}
.w-work .det-col ul{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:.3rem;}
.w-work .det-col li{font-size:.72rem;color:var(--muted);line-height:1.35;padding-left:.85rem;position:relative;}
.w-work .det-col li:before{content:'›';position:absolute;left:0;color:var(--accent);}
.w-work .det-stack{margin:.4rem 1rem;padding:.45rem .6rem;border:1px solid var(--border);border-radius:6px;font-family:var(--mono);font-size:.62rem;color:var(--faint);background:rgba(255,255,255,.02);}
.w-work .det-stack b{color:var(--muted);}
.w-work .det-cta{display:flex;gap:.4rem;padding:.25rem 1rem .7rem;}
.w-work .det-cta a{font-size:.68rem;font-weight:600;padding:.4rem .85rem;border-radius:6px;text-decoration:none;border:1px solid var(--border);transition:.12s;}
.w-work .det-cta a.primary{background:var(--accent);color:#04130b;border-color:var(--accent);} .w-work .det-cta a.primary:hover{filter:brightness(1.08);}
.w-work .det-cta a.ghost{color:var(--accent);} .w-work .det-cta a.ghost:hover{background:rgba(70,209,122,.1);}
/* ---- in-progress (WIP) band ---- */
.w-work .work-wip{display:grid;grid-template-columns:repeat(3,1fr);gap:.5rem;padding:.7rem 1rem;border-bottom:1px solid var(--border);}
.w-work .feat-cap.wip b{color:var(--blue);}
.w-work .wip-card{border:1px solid var(--border);border-radius:8px;padding:.6rem .65rem;background:linear-gradient(180deg,rgba(91,141,238,.05),rgba(91,141,238,0));cursor:pointer;transition:transform .14s ease,border-color .14s ease,box-shadow .14s ease;display:flex;flex-direction:column;gap:.4rem;opacity:.94;}
.w-work .wip-card:hover{transform:translateY(-2px);border-color:var(--blue);box-shadow:0 8px 24px -14px rgba(91,141,238,.5);opacity:1;}
.w-work .wip-card .feat-badge{color:var(--blue);border-color:rgba(91,141,238,.4);}
.w-work .feat-more{font-size:.62rem;color:var(--faint);margin-top:auto;}
.w-work .wip-card:hover .feat-more{color:var(--blue);}
/* ---- why / who block in the detail view ---- */
.w-work .det-why{padding:.1rem 1rem .5rem;}
.w-work .det-why h4{margin:.2rem 0 .35rem;font-size:.62rem;text-transform:uppercase;letter-spacing:.4px;color:var(--accent);}
.w-work .det-why p{margin:0 0 .45rem;font-size:.79rem;line-height:1.5;color:var(--muted);}
.w-work .det-why .det-who{color:var(--text);opacity:.9;} .w-work .det-why .det-who b{color:var(--accent);font-weight:600;}
/* ---- agent roster (AI-native company) ---- */
.w-work .det-agents{padding:.1rem 1rem .5rem;}
.w-work .det-agents h4{margin:.2rem 0 .5rem;font-size:.62rem;text-transform:uppercase;letter-spacing:.4px;color:var(--blue);}
.w-work .ag-grid{display:grid;grid-template-columns:1fr 1fr;gap:.34rem .9rem;}
.w-work .ag{font-size:.72rem;line-height:1.32;padding-left:.85rem;position:relative;}
.w-work .ag:before{content:'▸';position:absolute;left:0;top:0;color:var(--blue);font-size:.68rem;}
.w-work .ag b{color:var(--text);font-weight:600;} .w-work .ag span{color:var(--muted);}
/* ---- press / mentions in the detail view ---- */
.w-work .det-press{padding:.1rem 1rem .55rem;}
.w-work .det-press h4{margin:.2rem 0 .4rem;font-size:.62rem;text-transform:uppercase;letter-spacing:.4px;color:var(--blue);}
.w-work .det-press a{display:block;text-decoration:none;padding:.4rem .6rem;border:1px solid var(--border);border-radius:6px;margin-bottom:.3rem;transition:border-color .12s,background .12s;}
.w-work .det-press a:hover{border-color:var(--blue);background:rgba(91,141,238,.06);}
.w-work .det-press a b{color:var(--text);font-weight:600;font-size:.77rem;} .w-work .det-press a span{display:block;color:var(--muted);font-size:.68rem;margin-top:.12rem;}
.w-kernel .wbody{padding:0;font-family:var(--mono);}
.k-boot{padding:.7rem 1.1rem;color:var(--faint);font-size:.72rem;line-height:1.6;border-bottom:1px solid var(--border);} .k-boot .ok{color:var(--accent);}
.k-pin{display:flex;align-items:center;gap:.8rem;padding:.8rem 1.1rem;background:rgba(70,209,122,.08);border-bottom:1px solid var(--border);flex-wrap:wrap;}
.k-pin .pin{color:var(--accent);font-size:.66rem;text-transform:uppercase;} .k-pin .pt{flex:1;min-width:150px;} .k-pin .pt b{color:var(--text);font-size:.88rem;} .k-pin .pt span{display:block;color:var(--muted);font-size:.74rem;}
.k-pin .get{background:var(--accent);color:#062012;font-weight:700;font-family:var(--sans);font-size:.74rem;padding:.4rem .8rem;border-radius:6px;cursor:pointer;}
.k-row{display:flex;gap:.8rem;padding:.6rem 1.1rem;border-bottom:1px solid var(--border);font-size:.8rem;cursor:pointer;} .k-row:hover{background:rgba(70,209,122,.05);}
.k-row .ts{color:var(--faint);width:88px;flex:none;} .k-row .tag{width:78px;flex:none;text-transform:uppercase;font-size:.66rem;}
.k-row .tag.build{color:var(--accent);} .k-row .tag.play{color:var(--blue);} .k-row .tag.note{color:var(--yellow);} .k-row .tag.open{color:var(--muted);} .k-row .tag.press{color:var(--blue);} .k-row .tag.beta{color:var(--accent);}
.k-sig{padding:.6rem 1.1rem .45rem;font-size:.7rem;color:var(--muted);border-bottom:1px solid var(--border);background:rgba(97,175,239,.05);}
.k-sig .pin.sig{color:var(--blue);font-size:.66rem;text-transform:uppercase;margin-right:.5rem;letter-spacing:.4px;}
a.k-ext{text-decoration:none;color:inherit;} a.k-ext .ti span{color:var(--blue);opacity:.85;}
.k-row .ti{color:var(--text);} .k-row .ti span{display:block;color:var(--muted);font-size:.73rem;}
.k-sub{display:flex;justify-content:space-between;align-items:center;gap:.7rem;padding:.9rem 1.1rem;background:rgba(97,175,239,.05);flex-wrap:wrap;}
.k-sub .t{font-size:.82rem;} .k-sub .t b{color:var(--accent);} .k-sub input{background:var(--bg);border:1px solid var(--border);color:var(--text);border-radius:6px;padding:.45rem .7rem;font-family:var(--mono);font-size:.78rem;} .k-sub button{background:var(--accent);color:#062012;font-weight:700;font-family:var(--sans);font-size:.78rem;padding:.45rem .9rem;border:none;border-radius:6px;cursor:pointer;}
.w-conn .wbody{padding:1.1rem 1.3rem;font-family:var(--mono);font-size:.88rem;}
.w-conn .row{display:flex;justify-content:space-between;gap:1rem;padding:.55rem 0;border-bottom:1px solid var(--border);} .w-conn .row:hover .v{color:var(--accent);} .w-conn .k{color:var(--muted);} .w-conn .v{color:var(--text);}
/* ---- dock ---- */
.dock{position:fixed;bottom:0;left:50%;transform:translate(-50%,calc(100% - 15px));transition:transform .26s cubic-bezier(.2,.8,.2,1);z-index:9000;display:flex;gap:.4rem;align-items:flex-end;
padding:.45rem .55rem;background:rgba(14,20,16,.86);backdrop-filter:blur(18px);border:1px solid var(--border);border-radius:16px 16px 0 0;box-shadow:0 -6px 40px rgba(0,0,0,.5);}
.dock.up{transform:translate(-50%,-12px);border-radius:16px;}
.dock::after{content:"";position:absolute;top:-14px;left:0;right:0;height:14px;}/* hover catch-strip above the peek */
.dockpeek{position:fixed;left:0;right:0;bottom:0;height:20px;z-index:8999;}
/* floating window controls — appear with the dock, but separate (bottom-right) */
.wmctl{position:fixed;bottom:14px;right:18px;z-index:9000;display:flex;gap:.4rem;transform:translateY(74px);opacity:0;transition:transform .26s cubic-bezier(.2,.8,.2,1),opacity .2s;pointer-events:none;}
.wmctl.up{transform:translateY(0);opacity:1;pointer-events:auto;}
.wmctl .wbtn{width:38px;height:38px;border-radius:11px;display:flex;align-items:center;justify-content:center;background:rgba(14,20,16,.86);backdrop-filter:blur(14px);border:1px solid var(--border);color:var(--muted);font-family:var(--mono);font-size:.95rem;cursor:pointer;transition:transform .15s,color .15s,border-color .15s;}
.wmctl .wbtn:hover{color:var(--accent);border-color:var(--border-active);transform:translateY(-3px);}
.dock .app{width:48px;height:48px;border-radius:13px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
background:rgba(255,255,255,.03);border:1px solid var(--border);color:var(--muted);font-family:var(--mono);font-size:1rem;cursor:pointer;
transition:transform .16s cubic-bezier(.2,.8,.2,1),color .15s,border-color .15s;position:relative;}
.dock .app .lab{font-size:.5rem;letter-spacing:.3px;text-transform:uppercase;opacity:.8;}
.dock .app:hover{transform:translateY(-9px) scale(1.06);color:var(--accent);border-color:var(--border-active);}
.dock .app.run::before{content:"";position:absolute;bottom:-3px;width:5px;height:5px;border-radius:50%;background:var(--accent);box-shadow:0 0 6px var(--accent);}
.dock .sep{width:1px;background:var(--border);margin:.4rem .15rem;align-self:stretch;}
#toast{position:fixed;bottom:78px;left:50%;transform:translateX(-50%);background:var(--winhdr);border:1px solid var(--border);color:var(--text);font-family:var(--mono);font-size:.78rem;padding:.5rem .9rem;border-radius:8px;opacity:0;transition:opacity .2s;z-index:9001;pointer-events:none;}
/* ---- snap layouts ---- */
#zones{position:absolute;inset:0;pointer-events:none;z-index:60;}
#zones .zone{position:absolute;background:rgba(70,209,122,.08);border:1.5px solid var(--accent-dim);border-radius:10px;transition:background .1s,border-color .1s;}
#zones .zone.hot{background:rgba(70,209,122,.24);border-color:var(--accent);}
.snapbar{position:fixed;top:-130px;left:50%;transform:translateX(-50%);display:flex;gap:.5rem;padding:.55rem;background:rgba(14,20,16,.94);backdrop-filter:blur(14px);border:1px solid var(--border);border-top:none;border-radius:0 0 14px 14px;z-index:9500;opacity:0;transition:top .2s,opacity .2s;pointer-events:none;}
.snapbar.show{top:0;opacity:1;}
.snapbar .thumb{width:78px;height:48px;border:1px solid var(--border);border-radius:6px;padding:4px;display:grid;gap:3px;background:#0b0f0d;}
.snapbar .thumb.arm{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent);}
.snapbar .thumb .z{background:rgba(70,209,122,.18);border-radius:2px;}
.l-split{grid-template-columns:1.6fr 1fr;}
.l-thirds{grid-template-columns:1fr 1fr 1fr;}
.l-quarters{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;}
.l-mainR{grid-template-columns:1.6fr 1fr;grid-template-rows:1fr 1fr;grid-template-areas:"a b" "a c";}
.l-mainL{grid-template-columns:1fr 1.6fr;grid-template-rows:1fr 1fr;grid-template-areas:"b a" "c a";}
.l-topMain{grid-template-columns:1fr 1fr;grid-template-rows:1.3fr 1fr;grid-template-areas:"a a" "b c";}
.l-botMain{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1.3fr;grid-template-areas:"b c" "a a";}
.snapbar .a-a{grid-area:a;}.snapbar .a-b{grid-area:b;}.snapbar .a-c{grid-area:c;}.snapbar .a-d{grid-area:d;}
/* ---- empty-state: mouse-reactive pattern ---- */
#empty{position:fixed;inset:0;z-index:6;display:none;cursor:none;overflow:hidden;}
#empty.show{display:block;}
.lspacer{height:10000px;width:1px;opacity:0;pointer-events:none;}
#pat{position:absolute;inset:0;width:100%;height:100%;display:block;cursor:none;}
.ebrand{display:none;} /* wordmark now revealed through the stars (canvas text-mask), not drawn as a font */
.ebrand .ebadge{font-weight:800;font-size:clamp(2.2rem,6vw,4.2rem);letter-spacing:-1.5px;color:rgba(221,229,223,.045);}
.ebrand .ebadge .pr{color:rgba(70,209,122,.10);}
.ebrand .etag{font-family:var(--mono);color:rgba(126,140,132,.06);margin-top:.6rem;font-size:clamp(.85rem,2vw,1.05rem);}
.einstr{position:fixed;bottom:74px;left:50%;transform:translateX(-50%);font-family:var(--mono);font-size:.76rem;color:var(--faint);z-index:7;text-align:center;padding:0 1rem;pointer-events:none;}
.skytime{position:fixed;top:14px;left:50%;transform:translateX(-50%);z-index:8;font-family:var(--mono);font-size:.74rem;color:var(--muted);background:rgba(12,17,14,.85);backdrop-filter:blur(10px);border:1px solid var(--border);border-radius:999px;padding:.35rem .95rem;display:none;pointer-events:auto;cursor:pointer;transition:border-color .15s,color .15s;}
.skytime.show{display:block;} .skytime b{color:var(--accent);} .skytime i{color:var(--faint);font-style:normal;}
.skytime:hover{border-color:var(--accent);color:var(--text);} .skytime .sky-edit{color:var(--accent);opacity:.75;margin-left:.15rem;}
/* sky-time date/time picker */
.skypick{position:fixed;top:52px;left:50%;transform:translateX(-50%) translateY(-6px);z-index:9;width:290px;background:rgba(12,17,14,.94);backdrop-filter:blur(18px);border:1px solid var(--border);border-radius:14px;box-shadow:0 20px 60px rgba(0,0,0,.55);padding:14px;font-family:var(--mono);opacity:0;pointer-events:none;transition:opacity .16s,transform .16s;}
.skypick.show{opacity:1;pointer-events:auto;transform:translateX(-50%) translateY(0);}
.skypick .sp-h{font-size:.64rem;text-transform:uppercase;letter-spacing:.7px;color:var(--accent);margin-bottom:.5rem;display:flex;align-items:center;gap:.4rem;}
.skypick .sp-h::before{content:"◐";}
.skypick .sp-l{display:block;font-size:.6rem;text-transform:uppercase;letter-spacing:.4px;color:var(--faint);margin:0 0 .3rem;}
.skypick input[type=datetime-local]{width:100%;background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:8px;padding:.5rem .6rem;font-family:var(--mono);font-size:.82rem;color-scheme:dark;}
.skypick input[type=datetime-local]:focus{outline:none;border-color:var(--accent);}
.skypick .sp-presets{display:flex;flex-wrap:wrap;gap:.3rem;margin:.6rem 0;}
.skypick .sp-presets button{background:rgba(255,255,255,.04);color:var(--muted);border:1px solid var(--border);border-radius:99px;padding:.24rem .55rem;font-family:var(--mono);font-size:.64rem;cursor:pointer;transition:.12s;}
.skypick .sp-presets button:hover{border-color:var(--accent);color:var(--accent);}
.skypick .sp-actions{display:flex;gap:.4rem;margin-top:.5rem;}
.skypick .sp-actions button{flex:1;border-radius:8px;padding:.42rem;font-family:var(--mono);font-size:.72rem;cursor:pointer;border:1px solid var(--border);transition:.12s;}
.skypick .sp-cancel{background:none;color:var(--muted);} .skypick .sp-cancel:hover{border-color:var(--muted);color:var(--text);}
.skypick .sp-set{background:var(--accent);color:#04130b;border-color:var(--accent);font-weight:700;} .skypick .sp-set:hover{filter:brightness(1.08);}
/* star control panel (sliders) */
.starctl{position:fixed;top:14px;left:14px;z-index:8;width:236px;background:rgba(12,17,14,.92);backdrop-filter:blur(12px);border:1px solid var(--border);border-radius:12px;font-family:var(--mono);font-size:.7rem;color:var(--muted);overflow:hidden;cursor:auto;}
.starctl .sct-h{padding:.5rem .7rem;color:var(--accent);border-bottom:1px solid var(--border);cursor:pointer;display:flex;justify-content:space-between;}
.starctl .sct-h span{color:var(--faint);}
.starctl.collapsed .sct-body{display:none;}
.sct-body{padding:.6rem .7rem;max-height:78vh;overflow:auto;}
.sct-row{margin-bottom:.5rem;}
.sct-row label{display:flex;justify-content:space-between;margin-bottom:.18rem;}
.sct-row label b{color:var(--text);}
.sct-row input[type=range]{width:100%;accent-color:var(--accent);height:14px;}
.sct-row input[type=text],.sct-row select{width:100%;background:var(--bg);border:1px solid var(--border);color:var(--text);border-radius:6px;padding:.4rem .55rem;font-family:var(--mono);font-size:.72rem;}
.sct-btns{display:flex;gap:.35rem;margin-bottom:.45rem;}
.sct-btns button{flex:1;background:rgba(70,209,122,.12);color:var(--accent);border:1px solid var(--border-active);border-radius:6px;padding:.4rem .2rem;font-family:var(--mono);font-size:.64rem;cursor:pointer;}
.sct-btns button:hover{background:rgba(70,209,122,.22);}
#sct-out{width:100%;height:54px;background:var(--bg);border:1px solid var(--border);color:var(--muted);font-family:var(--mono);font-size:.6rem;border-radius:6px;resize:none;}
/* ===== production: hide the dev star-control panel, keep only My Sky / Random ===== */
body.prod #starctl .sct-h, body.prod #starctl .sct-row, body.prod #starctl #sct-out, body.prod #starctl #sct-copy{display:none;}
body.prod #starctl{width:auto;}
body.prod #starctl .sct-body{padding:.4rem;max-height:none;overflow:visible;}
body.prod #starctl .sct-btns{margin:0;}
body.prod #starctl .sct-btns button{font-size:.66rem;padding:.45rem .65rem;}
/* ===== mobile (≤820px): stacked single-column site, starfield as background ===== */
#mobile,.m-nav{display:none;}
@media (max-width:820px){
html,body{height:auto;overflow-x:hidden;overflow-y:auto;-webkit-text-size-adjust:100%;}
#desktop,.dock,.dockpeek,.wmctl,.snapbar,.einstr,.skytime,.starctl,.hint{display:none!important;}
#empty{display:block!important;position:fixed;inset:0;z-index:0;cursor:default;pointer-events:none;}
#pat{cursor:default;}
#mobile{display:block;position:relative;z-index:1;min-height:100vh;}
.m-top{position:sticky;top:0;z-index:5;display:flex;align-items:center;justify-content:space-between;gap:.6rem;
padding:.7rem .9rem;background:rgba(10,13,11,.72);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom:1px solid var(--border);}
.m-brand{font-family:var(--mono);font-weight:700;font-size:.95rem;color:var(--text);}
.m-brand .pr{color:var(--accent);}
.m-sky{font-family:var(--mono);font-size:.72rem;color:var(--accent);background:rgba(70,209,122,.1);border:1px solid var(--border-active);border-radius:999px;padding:.4rem .8rem;cursor:pointer;}
.m-main{padding:.85rem .85rem 92px;display:flex;flex-direction:column;gap:.85rem;}
.m-card{position:relative;display:flex;flex-direction:column;background:var(--win);border:1px solid var(--border);border-radius:12px;
overflow:hidden;container-type:inline-size;box-shadow:0 12px 32px rgba(0,0,0,.4);}
#mobile .wbar{cursor:default;}
body.macos #mobile .wbar{height:auto;justify-content:flex-start;} /* keep mac card headers left-aligned on mobile */
body.macos #mobile .wbar .ic{display:inline;} body.macos #mobile .wbar .name{position:static;text-align:left;}
#mobile .wbody{flex:none;min-height:0;overflow:visible;}
#mobile .w-term .wbody{max-height:62vh;overflow:auto;}
#mobile .w-work .fhead,#mobile .w-work .frow{grid-template-columns:22px 1fr 58px;}
#mobile .w-work .ty,#mobile .w-work .src{display:none;}
#mobile .w-work .work-feat,#mobile .w-work .work-wip{grid-template-columns:1fr;}
#mobile .w-work .det-grid,#mobile .w-work .ag-grid{grid-template-columns:1fr;}
#mobile .k-row{flex-wrap:wrap;} #mobile .k-row .ti{flex:1 1 100%;}
.m-nav{display:flex;position:fixed;left:0;right:0;bottom:0;z-index:6;justify-content:space-around;gap:.2rem;
padding:.4rem .4rem calc(.4rem + env(safe-area-inset-bottom));background:rgba(12,17,14,.93);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border-top:1px solid var(--border);}
.m-nav a{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;font-family:var(--mono);font-size:1.05rem;color:var(--muted);padding:.3rem 0;border-radius:9px;}
.m-nav a .lab{font-size:.52rem;text-transform:uppercase;letter-spacing:.3px;}
.m-nav a:active{color:var(--accent);background:rgba(70,209,122,.1);}
}
/* constellation focus detail panel (both skins; themes via --accent) */
.conpanel{position:fixed;top:0;right:0;bottom:0;width:min(360px,86vw);z-index:9400;
background:rgba(10,13,18,.84);backdrop-filter:blur(22px);-webkit-backdrop-filter:blur(22px);border-left:1px solid var(--border);
transform:translateX(103%);transition:transform .42s cubic-bezier(.2,.85,.25,1);overflow:auto;padding:2.6rem 1.4rem 1.6rem;}
.conpanel.show{transform:translateX(0);}
.conpanel .cp-x{position:absolute;top:.85rem;right:.95rem;width:30px;height:30px;border-radius:8px;border:1px solid var(--border);background:transparent;color:var(--muted);cursor:pointer;font-size:.78rem;transition:.15s;}
.conpanel .cp-x:hover{color:var(--text);border-color:var(--border-active);}
.cp-nm{font-weight:800;font-size:1.7rem;letter-spacing:-.5px;}
.cp-gen{font-family:var(--mono);color:var(--accent);font-size:.82rem;margin-top:.12rem;}
.cp-chips{display:flex;gap:.4rem;flex-wrap:wrap;margin:.9rem 0;}
.cp-chip{font-family:var(--mono);font-size:.66rem;color:var(--muted);background:rgba(255,255,255,.04);border:1px solid var(--border);border-radius:999px;padding:.28rem .6rem;}
.cp-p{color:#c7d0dc;line-height:1.66;font-size:.92rem;margin-bottom:.7rem;}
.cp-row{display:flex;justify-content:space-between;gap:1rem;padding:.5rem 0;border-bottom:1px solid var(--border);font-size:.85rem;}
.cp-row .k{color:var(--muted);} .cp-row .v{color:var(--text);text-align:right;}
.cp-star{color:var(--accent);font-family:var(--mono);}
.cp-hint{margin-top:1.1rem;font-family:var(--mono);font-size:.7rem;color:var(--faint);}
@media (max-width:820px){ .conpanel{display:none;} }
/* ===================== macOS skin (body.macos) ===================== */
/* desktop-style toggle (bottom-left) */
.osswitch{position:fixed;left:14px;bottom:14px;z-index:9200;display:flex;gap:3px;padding:3px;border-radius:11px;
background:rgba(20,22,26,.8);backdrop-filter:blur(18px);-webkit-backdrop-filter:blur(18px);border:1px solid rgba(255,255,255,.12);
font-family:var(--mono);font-size:.66rem;box-shadow:0 8px 26px rgba(0,0,0,.45);}
.osswitch button{border:none;background:transparent;color:var(--muted);padding:.34rem .62rem;border-radius:8px;cursor:pointer;font:inherit;transition:.15s;}
.osswitch button.on{background:rgba(70,209,122,.18);color:var(--accent);}
body.macos .osswitch button.on{background:rgba(10,132,255,.32);color:#fff;}
@media (max-width:820px){ .osswitch{bottom:auto;top:.62rem;left:auto;right:5.4rem;z-index:7;} }
/* theme: macOS dark mode + system blue, vibrancy, system font, gradient wallpaper */
body.macos{
--accent:#0a84ff; --accent-dim:#0a6fd6;
--win:rgba(44,44,50,.70); --winhdr:rgba(58,58,64,.62);
--border:rgba(255,255,255,.10); --border-active:rgba(255,255,255,.20);
--text:#f2f2f7; --muted:#9b9ba3; --faint:#6c6c74;
--sans:-apple-system,BlinkMacSystemFont,'SF Pro Text','Inter',system-ui,sans-serif;
font-family:var(--sans);
background:
radial-gradient(130% 120% at 50% -10%, #2b3a63 0%, #1d2740 36%, #121826 68%, #0b0e17 100%) fixed;
}
body.macos ::selection{background:#0a84ff;color:#fff;}
body.macos #desktop{top:0;}
body.macos .hint,body.macos .einstr{display:none;}
/* macOS edge-snap preview (blue, not the Linux green thumbnail bar) */
body.macos #zones .zone{background:rgba(10,132,255,.16);border:1.5px solid rgba(10,132,255,.5);border-radius:12px;
transition:left .12s cubic-bezier(.2,.8,.2,1),top .12s cubic-bezier(.2,.8,.2,1),width .12s cubic-bezier(.2,.8,.2,1),height .12s cubic-bezier(.2,.8,.2,1),background .1s;}
body.macos #zones .zone.hot{background:rgba(10,132,255,.26);border-color:#0a84ff;}
body.macos .k-boot{display:none;} /* drop the Linux dmesg boot lines in The Kernel */
/* windows: translucent vibrancy, soft shadow, big radius */
body.macos .win{border-radius:12px;background:var(--win);border:.5px solid var(--border);
backdrop-filter:blur(34px) saturate(1.5);-webkit-backdrop-filter:blur(34px) saturate(1.5);
box-shadow:0 30px 80px rgba(0,0,0,.55),0 0 0 .5px rgba(255,255,255,.06);}
body.macos .win:not(.focused){filter:none;opacity:.97;}
body.macos .win.focused{border-color:var(--border-active);box-shadow:0 38px 96px rgba(0,0,0,.66),0 0 0 .5px rgba(255,255,255,.14);}
/* title bar with left traffic lights + centered title */
body.macos .wbar{height:38px;padding:0 1rem;justify-content:center;position:relative;cursor:default;
background:var(--winhdr);border-bottom:.5px solid rgba(255,255,255,.07);font-family:var(--sans);font-size:.79rem;}
body.macos .win.focused .wbar{background:rgba(64,64,70,.6);}
body.macos .wbar:active{cursor:default;}
body.macos .wbar .ic{display:none;}
body.macos .wbar .name{position:absolute;left:0;right:0;text-align:center;font-weight:590;color:var(--text);pointer-events:none;}
body.macos .win:not(.focused) .wbar .name{color:var(--muted);}
body.macos .wbar .ctrls{position:absolute;left:13px;margin:0;display:flex;gap:8px;}
body.macos .wbar .ctrls span{width:12px;height:12px;border-radius:50%;font-size:0;line-height:12px;color:rgba(0,0,0,.55);overflow:hidden;}
body.macos .wbar .ctrls span:hover{font-size:.58rem;}
body.macos .wbar .c-x{order:0;background:#ff5f57;} /* close */
body.macos .wbar .c-min{order:1;background:#febc2e;} /* minimize */
body.macos .wbar .c-max{order:2;background:#28c840;} /* zoom */
body.macos .wbar .ctrls .c-x:hover{background:#ff5f57;color:rgba(0,0,0,.55);}
/* dock: translucent pill, rounded-square tiles, magnify (JS), label-on-hover */
body.macos .dock{background:rgba(46,46,53,.5);backdrop-filter:blur(30px) saturate(1.6);-webkit-backdrop-filter:blur(30px) saturate(1.6);
border:.5px solid rgba(255,255,255,.16);border-radius:22px;padding:.4rem .55rem;gap:.42rem;align-items:flex-end;
box-shadow:0 18px 50px rgba(0,0,0,.5),inset 0 0 0 .5px rgba(255,255,255,.08);} /* visibility now driven by .dock-pinned / .up (peeks only on the star map) */
body.macos .dock.up{border-radius:22px;}
body.macos .dock{align-items:flex-end;}
body.macos .dock .app{width:50px;height:50px;flex:none;border-radius:14px;color:#fff;font-size:1.3rem;
background:linear-gradient(160deg,rgba(98,108,130,.55),rgba(52,57,72,.55));border:.5px solid rgba(255,255,255,.16);
transition:transform .06s linear,border-color .15s;}
body.macos .dock .app .lab{display:none;}
body.macos .dock .app:hover{border-color:rgba(255,255,255,.34);}
/* magnification is JS-driven (resizes icons so the flex row reflows → grows up, no overlap) */
body.macos .dock .app.run::before{bottom:-6px;width:4px;height:4px;background:rgba(255,255,255,.85);box-shadow:none;}
body.macos .dock .sep{background:rgba(255,255,255,.18);}
body.macos .wmctl{transform:translateY(0);opacity:1;pointer-events:auto;} /* always reachable */
/* dock stays pinned (visible) in BOTH skins whenever a window is open; it auto-hides (peek + reveal) only on the star-map / empty screen */
body.dock-pinned .dock{transform:translate(-50%,-12px);}
/* menu bar (top) — only in macOS mode */
.menubar{display:none;}
body.macos .menubar{display:none;align-items:center;gap:1.1rem;position:fixed;top:0;left:0;right:0;height:26px;z-index:9100;
padding:0 .8rem;background:rgba(30,30,36,.55);backdrop-filter:blur(26px) saturate(1.4);-webkit-backdrop-filter:blur(26px) saturate(1.4);
border-bottom:.5px solid rgba(255,255,255,.08);font-family:var(--sans);font-size:.76rem;color:var(--text);}
.menubar .mb-logo{font-size:.95rem;line-height:1;}
.menubar .mb-app{font-weight:700;}
.menubar .mb-menu{color:#d6d6dc;cursor:default;opacity:.92;}
.menubar .mb-menu:hover{opacity:1;}
.menubar .mb-right{margin-left:auto;display:flex;align-items:center;gap:1rem;color:#e6e6ea;}
.menubar .mb-right .mb-ic{cursor:pointer;opacity:.9;font-size:.82rem;}
.menubar .mb-right .mb-ic:hover{opacity:1;}
.menubar .mb-clock{font-variant-numeric:tabular-nums;}
@media (max-width:820px){ body.macos .menubar{display:none;} body.macos #desktop{top:0;} }
/* Spotlight overlay */
.spotlight{display:none;position:fixed;inset:0;z-index:9600;align-items:flex-start;justify-content:center;background:rgba(0,0,0,.28);backdrop-filter:blur(3px);}
.spotlight.show{display:flex;}
.spotlight .sp-box{margin-top:16vh;width:min(580px,92vw);background:rgba(46,46,52,.82);backdrop-filter:blur(40px) saturate(1.6);-webkit-backdrop-filter:blur(40px) saturate(1.6);
border:.5px solid rgba(255,255,255,.16);border-radius:14px;box-shadow:0 40px 120px rgba(0,0,0,.6);overflow:hidden;}
.spotlight .sp-in{display:flex;align-items:center;gap:.7rem;padding:.85rem 1.1rem;}
.spotlight .sp-in .mag{color:var(--muted);font-size:1.1rem;}
.spotlight .sp-in input{flex:1;background:transparent;border:none;outline:none;color:#f2f2f7;font-family:var(--sans);font-size:1.25rem;}
.spotlight .sp-res{border-top:.5px solid rgba(255,255,255,.1);max-height:46vh;overflow:auto;}
.spotlight .sp-res:empty{display:none;}
.spotlight .sp-item{display:flex;align-items:center;gap:.7rem;padding:.6rem 1.1rem;cursor:pointer;color:#e6e6ea;font-family:var(--sans);font-size:.92rem;}
.spotlight .sp-item:hover,.spotlight .sp-item.sel{background:rgba(10,132,255,.85);color:#fff;}
.spotlight .sp-item .si-ic{width:20px;text-align:center;opacity:.9;}
.spotlight .sp-item .si-sub{margin-left:auto;font-size:.72rem;opacity:.7;}
</style>
</head>
<body class="prod">
<div class="menubar" id="menubar">
<svg class="mb-logo" viewBox="0 0 14 17" width="13" height="15" fill="currentColor" aria-hidden="true"><path d="M11.7 13.2c-.2.5-.5 1-.8 1.4-.5.6-.9 1-1.3 1.2-.5.3-1 .4-1.6.4-.4 0-.9-.1-1.5-.3-.6-.2-1.1-.3-1.5-.3-.4 0-.9.1-1.5.3-.6.2-1 .3-1.4.3-.6 0-1.1-.2-1.6-.5-.4-.3-.9-.8-1.4-1.4C1 13.3.6 12.4.3 11.4 0 10.3-.1 9.3-.1 8.2c0-1.2.3-2.2.8-3 .4-.7.9-1.2 1.6-1.6.7-.4 1.4-.6 2.1-.6.4 0 1 .1 1.7.4.7.3 1.1.4 1.3.4.1 0 .6-.2 1.5-.5.8-.3 1.5-.4 2-.4 1.5.1 2.6.7 3.4 1.8-1.3.8-2 1.9-1.9 3.4 0 1.1.4 2.1 1.2 2.8.4.4.8.6 1.3.8-.1.3-.2.6-.4.9zM9.3.3c0 .9-.3 1.7-1 2.5-.7.9-1.6 1.4-2.6 1.3 0-.1 0-.2 0-.3 0-.9.4-1.8 1-2.5.3-.4.8-.7 1.3-.9.4-.2.8-.3 1.2-.3 0 .1.1.1.1.2z"/></svg>
<span class="mb-app">captKernel</span>
<span class="mb-menu">File</span><span class="mb-menu">Edit</span><span class="mb-menu">View</span><span class="mb-menu">Window</span><span class="mb-menu">Help</span>
<span class="mb-right">
<svg class="mb-ic" id="mb-cc" viewBox="0 0 16 16" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.3" aria-hidden="true"><rect x="2" y="3.4" width="12" height="2.8" rx="1.4"/><rect x="2" y="9.8" width="12" height="2.8" rx="1.4"/><circle cx="10.6" cy="4.8" r="1.5" fill="currentColor" stroke="none"/><circle cx="5.4" cy="11.2" r="1.5" fill="currentColor" stroke="none"/></svg>
<span class="mb-ic" id="mb-spot" title="Spotlight (⌘Space)">⌕</span>
<span class="mb-clock" id="mb-clock"></span>
</span>
</div>
<div class="spotlight" id="spotlight">
<div class="sp-box">
<div class="sp-in"><span class="mag">⌕</span><input id="sp-input" placeholder="Spotlight Search" autocomplete="off" spellcheck="false" /></div>
<div class="sp-res" id="sp-res"></div>
</div>
</div>
<div id="desktop">
<div id="zones"></div>
</div>
<div id="empty">
<div class="lspacer"></div>
<canvas id="pat"></canvas>
<div class="ebrand">
<div class="ebadge"><span class="pr">>_</span> captKernel</div>
<div class="etag">an AI studio — building in the open</div>
</div>
<div class="einstr">open a window from the dock · press ★ My Sky, then click to reveal your constellations · drag a window to the TOP to snap</div>
<div class="skytime" id="skytime"></div>
<div class="skypick" id="skypick">
<div class="sp-h">set sky time</div>
<label class="sp-l">Date & time</label>
<input type="datetime-local" id="sp-dt">
<div class="sp-presets">
<button data-preset="now">now</button>
<button data-preset="tonight">tonight 9pm</button>
<button data-preset="dawn">dawn 5am</button>
<button data-preset="-1h">−1h</button>
<button data-preset="+1h">+1h</button>
<button data-preset="-1d">−1 day</button>
<button data-preset="+1d">+1 day</button>
</div>
<div class="sp-actions"><button class="sp-cancel" id="sp-cancel">cancel</button><button class="sp-set" id="sp-set">done</button></div>
</div>
<div class="starctl" id="starctl">
<div class="sct-h" id="sct-h">★ star controls <span>– hide</span></div>
<div class="sct-body" id="sct-body">
<div class="sct-btns">
<button id="sct-sky">★ My sky</button>
<button id="sct-rand">Random</button>
<button id="sct-copy">Copy values</button>
</div>
<div class="sct-row"><label>Wordmark text</label><input type="text" id="sct-text" value="captKernel"></div>
<div class="sct-row"><label>Wordmark font</label><select id="sct-font">
<option value="Inter, sans-serif|800">Inter</option>
<option value="'JetBrains Mono', monospace|800">JetBrains Mono</option>
<option value="'Space Grotesk', sans-serif|700">Space Grotesk</option>
<option value="'Bricolage Grotesque', sans-serif|800">Bricolage</option>
<option value="Archivo, sans-serif|900">Archivo</option>
<option value="Syne, sans-serif|800">Syne</option>
<option value="'Instrument Serif', serif|400">Instrument Serif</option>
</select></div>
<div class="sct-row"><label>Star trails (My Sky scroll)</label><input type="checkbox" id="sct-trails" checked></div>
<textarea id="sct-out" readonly placeholder="settings appear here when you hit Copy values"></textarea>
</div>
</div>
</div>
<div class="snapbar" id="snapbar">
<div class="thumb l-split" data-k="split"><div class="z"></div><div class="z"></div></div>
<div class="thumb l-quarters" data-k="quarters"><div class="z"></div><div class="z"></div><div class="z"></div><div class="z"></div></div>
<div class="thumb l-mainR" data-k="mainR"><div class="z a-a"></div><div class="z a-b"></div><div class="z a-c"></div></div>
<div class="thumb l-thirds" data-k="thirds"><div class="z"></div><div class="z"></div><div class="z"></div></div>
<div class="thumb l-mainL" data-k="mainL"><div class="z a-a"></div><div class="z a-b"></div><div class="z a-c"></div></div>
<div class="thumb l-topMain" data-k="topMain"><div class="z a-a"></div><div class="z a-b"></div><div class="z a-c"></div></div>
<div class="thumb l-botMain" data-k="botMain"><div class="z a-a"></div><div class="z a-b"></div><div class="z a-c"></div></div>
</div>
<div class="dockpeek" id="dockpeek"></div>
<div class="dock">
<div class="app" data-open="home">⌂<span class="lab">home</span></div>
<div class="app" data-open="term">▸_<span class="lab">term</span></div>
<div class="app" data-open="about">◎<span class="lab">about</span></div>
<div class="app" data-open="work">▦<span class="lab">work</span></div>
<div class="app" data-open="kernel">✎<span class="lab">kernel</span></div>
<div class="app" data-open="connect">✉<span class="lab">connect</span></div>
<div class="sep"></div>
<div class="app" data-link="github">⌥<span class="lab">gh</span></div>
<div class="app" data-link="x">𝕏<span class="lab">x</span></div>
</div>
<div class="wmctl" id="wmctl">
<div class="wbtn" data-act="openall" title="open all windows">⊞</div>
<div class="wbtn" data-act="closeall" title="close all windows">⊗</div>
</div>
<div id="toast"></div>
<!-- constellation focus detail panel -->
<div class="conpanel" id="conpanel">
<button class="cp-x" id="cp-x" title="close (Esc)">✕</button>
<div class="cp-body" id="cp-body"></div>
</div>
<!-- ===== desktop-style toggle (Linux ⇄ macOS) ===== -->
<div class="osswitch" id="osswitch" title="Switch desktop style">
<button type="button" data-os="linux">Linux</button>
<button type="button" data-os="macos">macOS</button>
</div>
<!-- ===== mobile layout (built by initMobile on ≤820px) ===== -->
<div id="mobile">
<header class="m-top">
<span class="m-brand"><span class="pr">>_</span> captKernel</span>
<button class="m-sky" id="m-sky">★ My Sky</button>
</header>
<main class="m-main" id="m-main"></main>
</div>
<nav class="m-nav" id="m-nav"></nav>
<script>
window.__CONMETA={"Aql":{"img":"aquila.webp","iw":512,"ih":512,"a":[[163,232,297.6958,8.8683],[385,131,284.9057,15.0683],[397,397,286.5622,-4.8826]]},"And":{"img":"andromeda.webp","iw":512,"ih":512,"a":[[198,215,12.4535,41.0789],[337,136,9.8317,30.861],[224,428,30.9748,42.3297]]},"Scl":{"img":"sculptor.webp","iw":256,"ih":256,"a":[[231,39,349.706,-32.532],[240,106,353.2428,-37.8183],[32,174,14.6515,-29.3575]]},"Ara":{"img":"ara.webp","iw":256,"ih":256,"a":[[98,70,254.6551,-55.9901],[191,93,262.7746,-60.6838],[107,249,271.6578,-50.0915]]},"Lib":{"img":"libra.webp","iw":256,"ih":256,"a":[[41,27,229.2517,-9.3829],[58,170,238.4564,-16.7293],[224,107,226.0176,-25.282]]},"Cet":{"img":"cetus.webp","iw":512,"ih":512,"a":[[87,63,45.5938,4.3529],[28,274,41.0306,-13.8587],[412,440,4.857,-8.8239]]},"Ari":{"img":"aries.webp","iw":256,"ih":256,"a":[[12,130,42.496,27.2605],[58,206,44.803,21.3404],[210,47,28.3826,19.2939]]},"Sct":{"img":"scutum.webp","iw":256,"ih":256,"a":[[52,17,281.7936,-4.7479],[224,124,277.2994,-14.5658],[139,206,283.6796,-15.603]]},"Pyx":{"img":"pyxis.webp","iw":256,"ih":256,"a":[[152,220,127.6192,-32.1593],[94,159,130.8981,-33.1864],[44,202,130.0256,-35.3084]]},"Boo":{"img":"bootes.webp","iw":512,"ih":512,"a":[[225,222,221.2467,27.0742],[365,184,218.0195,38.3082],[207,401,208.6712,18.3977]]},"Cae":{"img":"caelum.webp","iw":256,"ih":256,"a":[[16,231,67.7087,-44.9537],[76,145,70.1405,-41.8638],[199,75,70.5145,-37.1443]]},"Cha":{"img":"chamaeleon.webp","iw":256,"ih":256,"a":[[29,214,184.5868,-79.3122],[73,123,158.8671,-78.6078],[184,33,124.6315,-76.9197]]},"Cnc":{"img":"cancer.webp","iw":256,"ih":256,"a":[[29,166,134.6217,11.8577],[101,255,124.1288,9.1855],[206,91,125.0161,27.2177]]},"Cap":{"img":"capricornus.webp","iw":512,"ih":512,"a":[[15,436,326.7602,-16.1273],[403,7,304.5136,-12.5449],[460,438,312.9554,-26.9191]]},"Car":{"img":"argonavis.webp","iw":512,"ih":512,"a":[[202,455,138.2999,-69.7172],[62,216,153.684,-42.1219],[298,22,121.886,-24.3043]]},"Cas":{"img":"cassiopeia.webp","iw":512,"ih":512,"a":[[390,336,28.5989,63.6701],[163,156,10.1268,56.5373],[73,243,2.2945,59.1498]]},"Cen":{"img":"centaurus.webp","iw":512,"ih":512,"a":[[118,157,211.6706,-36.37],[194,444,219.9021,-60.834],[463,412,173.9453,-63.0198]]},"Cep":{"img":"cepheus.webp","iw":512,"ih":512,"a":[[60,335,354.8371,77.6324],[125,170,322.165,70.5607],[335,147,332.7137,58.2013]]},"Com":{"img":"coma-berenices.webp","iw":256,"ih":256,"a":[[27,199,197.497,17.5295],[38,58,197.9683,27.8782],[172,64,186.7345,28.2684]]},"CVn":{"img":"canes-venatici.webp","iw":256,"ih":256,"a":[[117,113,196.4351,35.7989],[206,40,188.4356,41.3575],[207,152,188.4122,33.2476]]},"Aur":{"img":"auriga.webp","iw":512,"ih":512,"a":[[196,189,89.9303,37.2126],[419,208,79.1723,45.998],[290,423,74.2484,33.1661]]},"Col":{"img":"columba.webp","iw":256,"ih":256,"a":[[139,29,95.5284,-33.4364],[40,190,89.7867,-42.8151],[204,211,82.8031,-35.4705]]},"Cir":{"img":"circinus.webp","iw":256,"ih":256,"a":[[5,36,230.8443,-59.3208],[39,11,229.3785,-58.8012],[235,239,220.6268,-64.9751]]},"Crt":{"img":"crater.webp","iw":256,"ih":256,"a":[[45,41,179.004,-17.1508],[160,149,169.8352,-14.7785],[55,242,167.9145,-22.8258]]},"CrA":{"img":"corona-australis.webp","iw":256,"ih":256,"a":[[14,142,286.6046,-37.0634],[218,34,278.0889,-39.704],[195,208,284.0706,-42.7107]]},"CrB":{"img":"corona-borealis.webp","iw":256,"ih":256,"a":[[16,186,240.3607,29.8511],[201,203,235.6857,26.2956],[157,20,233.2324,31.3591]]},"Crv":{"img":"corvus.webp","iw":256,"ih":256,"a":[[65,59,187.4661,-16.5154],[77,235,188.5968,-23.3968],[213,187,182.5312,-22.6198]]},"Cru":{"img":"crux.webp","iw":128,"ih":128,"a":[[112,21,187.7915,-57.1132],[42,20,191.9303,-59.6888],[21,106,186.6496,-63.0991]]},"Cyg":{"img":"cygnus.webp","iw":512,"ih":512,"a":[[7,382,326.0357,28.7426],[474,46,289.2757,53.3685],[467,453,292.6803,27.9597]]},"Del":{"img":"delphinus.webp","iw":256,"ih":256,"a":[[59,31,311.6646,16.1243],[75,148,312.4074,12.5451],[211,143,308.3032,11.3033]]},"Dor":{"img":"dorado.webp","iw":256,"ih":256,"a":[[56,197,88.5252,-63.0898],[75,228,86.1932,-65.7355],[219,46,64.0066,-51.4866]]},"Dra":{"img":"draco.webp","iw":512,"ih":512,"a":[[13,411,172.8509,69.3311],[361,154,262.6082,52.3014],[449,429,297.0431,70.2679]]},"Nor":{"img":"norma.webp","iw":128,"ih":128,"a":[[17,45,240.8037,-49.2297],[101,38,243.3697,-54.6305],[16,112,246.796,-47.5548]]},"Eri":{"img":"eridanus.webp","iw":512,"ih":512,"a":[[41,95,71.3756,-3.2547],[296,44,44.1069,-8.8981],[493,490,24.4285,-57.2368]]},"Sge":{"img":"sagitta.webp","iw":256,"ih":256,"a":[[6,12,301.2896,19.9911],[249,213,295.0241,18.0139],[218,243,295.2622,17.476]]},"For":{"img":"fornax.webp","iw":256,"ih":256,"a":[[42,125,48.0189,-28.9876],[128,37,42.4758,-27.942],[190,129,42.2726,-32.4059]]},"Gem":{"img":"gemini.webp","iw":256,"ih":256,"a":[[14,81,116.1118,24.398],[117,252,101.3224,12.8956],[249,165,91.0301,23.2633]]},"Cam":{"img":"camelopardalis.webp","iw":256,"ih":256,"a":[[77,46,80.6397,79.2312],[128,135,73.5125,66.3427],[219,136,52.2672,59.9403]]},"CMa":{"img":"canis-major.webp","iw":512,"ih":512,"a":[[21,347,111.0238,-29.3031],[321,24,103.5475,-12.0386],[318,492,95.0783,-30.0634]]},"UMa":{"img":"ursa-major.webp","iw":512,"ih":512,"a":[[26,75,206.8852,49.3133],[452,272,127.5661,60.7182],[258,394,154.2741,42.9144]]},"Gru":{"img":"grus.webp","iw":256,"ih":256,"a":[[49,109,346.7197,-43.5204],[85,206,342.1387,-51.3169],[220,45,328.4822,-37.3649]]},"Her":{"img":"hercules.webp","iw":512,"ih":512,"a":[[44,115,245.4801,19.1531],[254,477,244.9352,46.3134],[441,102,271.8856,28.7625]]},"Hor":{"img":"horlogium.webp","iw":256,"ih":256,"a":[[16,235,63.5005,-42.2944],[184,67,40.1651,-54.5499],[235,119,45.9034,-59.7378]]},"Hya":{"img":"hydra.webp","iw":512,"ih":512,"a":[[26,491,199.7304,-23.1715],[111,149,170.2841,6.0293],[401,33,133.8484,5.9456]]},"Hyi":{"img":"hydrus.webp","iw":256,"ih":256,"a":[[14,204,29.6922,-61.5698],[201,43,6.4378,-77.2542],[241,215,56.8098,-74.239]]},"Ind":{"img":"indus.webp","iw":256,"ih":256,"a":[[64,143,309.3918,-47.2915],[154,20,313.7025,-58.4541],[175,98,319.9666,-53.4494]]},"Lac":{"img":"lacerta.webp","iw":256,"ih":256,"a":[[249,42,335.8901,52.229],[108,123,337.6219,43.1234],[67,215,333.9924,37.7487]]},"Mon":{"img":"monoceros.webp","iw":512,"ih":512,"a":[[20,306,122.1485,-2.9838],[394,80,100.2444,9.8958],[509,359,93.7139,-6.2748]]},"Lep":{"img":"lepus.webp","iw":256,"ih":256,"a":[[21,48,91.5388,-14.9353],[246,62,78.0746,-11.8691],[213,235,76.3653,-22.371]]},"Leo":{"img":"leo.webp","iw":512,"ih":512,"a":[[69,411,177.2649,14.5721],[383,186,152.093,11.9672],[321,32,146.4628,23.7743]]},"Lup":{"img":"lupus.webp","iw":512,"ih":512,"a":[[90,257,228.0712,-52.0992],[207,435,216.5451,-45.3793],[425,239,230.4515,-36.2614]]},"Lyn":{"img":"lynx.webp","iw":512,"ih":512,"a":[[100,216,135.1603,41.783],[337,212,111.6786,49.2115],[472,119,94.9057,59.011]]},"Lyr":{"img":"lyra.webp","iw":256,"ih":256,"a":[[100,96,283.6262,36.8986],[157,38,279.2347,38.7837],[139,162,282.52,33.3627]]},"Ant":{"img":"antlia.webp","iw":128,"ih":128,"a":[[4,84,156.7879,-31.0678],[72,69,146.0504,-27.7695],[42,120,149.7178,-35.891]]},"Mic":{"img":"microscopium.webp","iw":256,"ih":256,"a":[[122,226,319.4845,-32.1725],[168,148,315.3228,-32.2577],[234,115,312.492,-33.7797]]},"Mus":{"img":"musca.webp","iw":256,"ih":256,"a":[[57,52,188.1167,-72.133],[177,68,191.57,-68.1081],[129,236,176.4017,-66.7288]]},"Oct":{"img":"octans.webp","iw":256,"ih":256,"a":[[15,16,216.7301,-83.6679],[236,239,325.3689,-77.39],[247,140,341.5146,-81.3816]]},"Aps":{"img":"apus.webp","iw":256,"ih":256,"a":[[66,60,250.7694,-77.5174],[76,87,248.3628,-78.8971],[163,110,221.9655,-79.0448]]},"Oph":{"img":"ophiuchus.webp","iw":512,"ih":512,"a":[[5,183,284.0549,4.2036],[452,47,236.5469,15.4218],[238,453,262.854,-23.9626]]},"Ori":{"img":"orion.webp","iw":512,"ih":512,"a":[[59,11,88.5958,20.2762],[329,477,86.9391,-9.6696],[421,91,72.46,6.9613]]},"Pav":{"img":"pavo.webp","iw":256,"ih":256,"a":[[55,60,306.4119,-56.7351],[110,208,300.1481,-72.9105],[235,146,266.4333,-64.7239]]},"Peg":{"img":"pegasus.webp","iw":512,"ih":512,"a":[[164,41,326.0465,9.875],[47,283,332.4968,33.1782],[409,349,3.309,15.1836]]},"Pic":{"img":"pictor.webp","iw":256,"ih":256,"a":[[4,252,102.0477,-61.9414],[148,138,87.4569,-56.1667],[167,38,86.8212,-51.0665]]},"Per":{"img":"perseus.webp","iw":512,"ih":512,"a":[[164,323,59.4635,40.0102],[299,175,51.0807,49.8612],[385,386,42.6461,38.3186]]},"Equ":{"img":"equuleus.webp","iw":256,"ih":256,"a":[[17,180,317.5854,10.1316],[149,86,318.956,5.2479],[160,160,320.7234,6.8111]]},"CMi":{"img":"canis-minor.webp","iw":256,"ih":256,"a":[[96,43,116.5675,10.7683],[101,171,114.8255,5.225],[184,124,111.7877,8.2893]]},"LMi":{"img":"leo-minor.webp","iw":256,"ih":256,"a":[[8,40,163.3279,34.2149],[214,127,143.5558,36.3976],[61,155,154.0601,29.3105]]},"Vul":{"img":"vulpecula.webp","iw":256,"ih":256,"a":[[35,133,300.2752,27.7536],[174,111,292.1764,24.6649],[242,135,289.0543,21.3904]]},"UMi":{"img":"ursa-minor.webp","iw":256,"ih":256,"a":[[15,20,37.9546,89.2641],[193,51,183.0498,77.6162],[93,209,244.3761,75.7553]]},"Phe":{"img":"phoenix.webp","iw":256,"ih":256,"a":[[55,243,28.4114,-46.3027],[209,15,2.3527,-45.7474],[229,214,17.0962,-55.2458]]},"Psc":{"img":"pisces.webp","iw":512,"ih":512,"a":[[24,104,15.7046,31.8043],[111,489,30.5117,2.7638],[481,155,349.2914,3.2823]]},"PsA":{"img":"piscis-austrinus.webp","iw":256,"ih":256,"a":[[190,5,343.9871,-32.5396],[82,202,326.934,-30.8983],[236,92,340.164,-27.0436]]},"Vol":{"img":"volans.webp","iw":256,"ih":256,"a":[[55,85,135.6117,-66.3961],[210,122,109.2076,-67.9572],[207,163,107.1869,-70.4989]]},"Ret":{"img":"reticulum.webp","iw":128,"ih":128,"a":[[47,56,59.6865,-61.4002],[78,88,63.6061,-62.4738],[16,111,64.121,-59.3022]]},"Sgr":{"img":"sagittarius.webp","iw":512,"ih":512,"a":[[96,82,290.4182,-17.8472],[307,492,290.8047,-44.7998],[506,100,266.8901,-27.8308]]},"Sco":{"img":"scorpius.webp","iw":512,"ih":512,"a":[[447,29,241.3593,-19.8055],[62,365,263.4022,-37.1038],[217,462,253.6459,-42.3613]]},"Sex":{"img":"sextans.webp","iw":128,"ih":128,"a":[[26,54,157.5728,-0.637],[68,36,151.9845,-0.3717],[118,84,148.1268,-8.105]]},"Men":{"img":"mensa.webp","iw":256,"ih":256,"a":[[100,67,70.7665,-70.931],[179,136,82.9702,-76.3409],[54,183,92.1844,-68.8434]]},"Tau":{"img":"taurus.webp","iw":512,"ih":512,"a":[[13,92,84.4112,21.1425],[399,438,51.2033,9.0289],[382,192,57.2906,24.0534]]},"Tel":{"img":"telescopium.webp","iw":128,"ih":128,"a":[[30,66,280.1829,-47.0272],[101,40,276.7434,-45.9685],[106,92,277.2077,-49.0706]]},"Tuc":{"img":"tucana.webp","iw":256,"ih":256,"a":[[53,121,7.8861,-62.9582],[154,86,349.3573,-58.2357],[224,141,334.6255,-60.2596]]},"Tri":{"img":"triangulum.webp","iw":128,"ih":128,"a":[[16,42,32.3859,34.9873],[13,70,33.9845,33.3589],[97,78,28.2704,29.5788]]},"TrA":{"img":"triangulum-australe.webp","iw":128,"ih":128,"a":[[26,12,238.7857,-63.4307],[108,15,229.7274,-68.6795],[60,106,252.1662,-69.0277]]},"Aqr":{"img":"aquarius.webp","iw":512,"ih":512,"a":[[144,464,350.7426,-20.1006],[179,98,331.446,-0.3199],[465,49,311.919,-9.4958]]},"Vir":{"img":"virgo.webp","iw":512,"ih":512,"a":[[65,389,221.5622,1.8929],[454,57,176.4648,6.5294],[338,382,201.2982,-11.1613]]}};
window.__CONINFO={
"And":{"nm":"Andromeda","gen":"Andromedae","mean":"The Chained Maiden","star":"Alpheratz","hemi":"Northern","season":"Autumn","desc":["The princess of Greek myth, chained to a rock as a sacrifice and rescued by Perseus.","Home to the Andromeda Galaxy (M31) — the nearest large spiral and the most distant object visible to the naked eye."],"rows":[["Deep sky","Andromeda Galaxy (M31)"],["Best viewed","Oct–Dec"]]},
"Ant":{"nm":"Antlia","gen":"Antliae","mean":"The Air Pump","star":"α Antliae"},
"Aps":{"nm":"Apus","gen":"Apodis","mean":"The Bird-of-Paradise","star":"α Apodis"},
"Aqr":{"nm":"Aquarius","gen":"Aquarii","mean":"The Water Bearer","star":"Sadalsuud","hemi":"Equatorial","season":"Autumn","desc":["An ancient zodiac constellation, the Water Bearer pouring a stream that flows toward the Southern Fish.","Faint but vast, riding the ecliptic so the Moon and planets pass through it."],"rows":[["Deep sky","Helix Nebula (NGC 7293)"],["Best viewed","Sep–Oct"]]},
"Aql":{"nm":"Aquila","gen":"Aquilae","mean":"The Eagle","star":"Altair","hemi":"Equatorial","season":"Summer","desc":["The eagle that carried the thunderbolts of Zeus. Its brightest star Altair is one corner of the Summer Triangle.","Straddles the celestial equator along the bright star clouds of the Milky Way."],"rows":[["Brightest","Altair (α Aql) · 0.76"],["Best viewed","Jul–Sep"]]},
"Ara":{"nm":"Ara","gen":"Arae","mean":"The Altar","star":"β Arae"},
"Ari":{"nm":"Aries","gen":"Arietis","mean":"The Ram","star":"Hamal","hemi":"Northern","season":"Autumn"},
"Aur":{"nm":"Auriga","gen":"Aurigae","mean":"The Charioteer","star":"Capella","hemi":"Northern","season":"Winter","desc":["The charioteer, often shown carrying a goat and her kids. Capella, its brilliant lead star, is the sixth-brightest in the sky.","A rich Milky Way constellation packed with open star clusters."],"rows":[["Brightest","Capella (α Aur) · 0.08"],["Deep sky","M36 · M37 · M38"]]},
"Boo":{"nm":"Boötes","gen":"Boötis","mean":"The Herdsman","star":"Arcturus","hemi":"Northern","season":"Spring","desc":["The herdsman driving the bears around the pole. Its kite-shaped figure is anchored by Arcturus, the brightest star in the northern sky.","Find it by following the arc of the Big Dipper's handle — ‘arc to Arcturus’."],"rows":[["Brightest","Arcturus (α Boo) · −0.05"],["Best viewed","Apr–Jun"]]},
"Cae":{"nm":"Caelum","gen":"Caeli","mean":"The Chisel","star":"α Caeli"},
"Cam":{"nm":"Camelopardalis","gen":"Camelopardalis","mean":"The Giraffe","star":"β Camelopardalis"},
"Cnc":{"nm":"Cancer","gen":"Cancri","mean":"The Crab","star":"Tarf","hemi":"Northern","season":"Spring","desc":["The faintest of the zodiac constellations, the crab crushed underfoot by Hercules.","Holds the Beehive Cluster (M44), a glittering naked-eye swarm of stars."],"rows":[["Deep sky","Beehive Cluster (M44)"],["Best viewed","Feb–Apr"]]},
"CVn":{"nm":"Canes Venatici","gen":"Canum Venaticorum","mean":"The Hunting Dogs","star":"Cor Caroli","hemi":"Northern","season":"Spring","desc":["The hunting dogs of Boötes the herdsman.","Home to the Whirlpool Galaxy (M51), the first galaxy seen to have spiral structure."],"rows":[["Deep sky","Whirlpool Galaxy (M51)"]]},
"CMa":{"nm":"Canis Major","gen":"Canis Majoris","mean":"The Great Dog","star":"Sirius","hemi":"Southern","season":"Winter","desc":["Orion's larger hunting dog, marked by Sirius — the brightest star in the entire night sky.","Low in the winter evening sky, blazing below and to the left of Orion."],"rows":[["Brightest","Sirius (α CMa) · −1.46"],["Best viewed","Dec–Feb"]]},
"CMi":{"nm":"Canis Minor","gen":"Canis Minoris","mean":"The Lesser Dog","star":"Procyon","hemi":"Equatorial","season":"Winter"},
"Cap":{"nm":"Capricornus","gen":"Capricorni","mean":"The Sea Goat","star":"Deneb Algedi","hemi":"Southern","season":"Autumn"},
"Car":{"nm":"Carina","gen":"Carinae","mean":"The Keel","star":"Canopus","hemi":"Southern","season":"Summer","desc":["The keel of the great ship Argo. Canopus, its leader, is the second-brightest star in the sky.","Contains the vast Carina Nebula and the once-rivalrous variable star Eta Carinae."],"rows":[["Brightest","Canopus (α Car) · −0.74"],["Deep sky","Carina Nebula (NGC 3372)"]]},
"Cas":{"nm":"Cassiopeia","gen":"Cassiopeiae","mean":"The Queen","star":"Schedar","hemi":"Northern","season":"Autumn","desc":["The vain queen, condemned to circle the pole forever. Her unmistakable ‘W’ (or ‘M’) of five bright stars never sets from mid-northern latitudes.","Sits in a glittering stretch of the Milky Way full of star clusters."],"rows":[["Shape","The ‘W’ asterism"],["Best viewed","Sep–Jan"]]},
"Cen":{"nm":"Centaurus","gen":"Centauri","mean":"The Centaur","star":"Rigil Kentaurus","hemi":"Southern","season":"Autumn","desc":["The wise centaur Chiron. Its brightest star, Alpha Centauri, is the closest star system to the Sun (4.4 light-years).","Hosts Omega Centauri, the largest and brightest globular cluster in the sky."],"rows":[["Brightest","Rigil Kent. (α Cen) · −0.27"],["Deep sky","Omega Centauri (NGC 5139)"]]},
"Cep":{"nm":"Cepheus","gen":"Cephei","mean":"The King","star":"Alderamin","hemi":"Northern","season":"Autumn"},
"Cet":{"nm":"Cetus","gen":"Ceti","mean":"The Sea Monster","star":"Deneb Kaitos","hemi":"Equatorial","season":"Autumn","desc":["The sea monster sent to devour Andromeda. One of the largest constellations in the sky.","Home to Mira, the first variable star discovered, which fades and brightens over ~11 months."],"rows":[["Notable","Mira (ο Ceti) — variable"]]},
"Cha":{"nm":"Chamaeleon","gen":"Chamaeleontis","mean":"The Chameleon","star":"α Chamaeleontis"},
"Cir":{"nm":"Circinus","gen":"Circini","mean":"The Compasses","star":"α Circini"},
"Col":{"nm":"Columba","gen":"Columbae","mean":"The Dove","star":"Phact"},
"Com":{"nm":"Coma Berenices","gen":"Comae Berenices","mean":"Berenice's Hair","star":"β Comae","hemi":"Northern","season":"Spring","desc":["The flowing hair of Queen Berenice, sacrificed to the gods.","A window out of the galactic plane, dense with distant galaxies and the Coma Cluster."],"rows":[["Deep sky","Coma Star Cluster"]]},
"CrA":{"nm":"Corona Australis","gen":"Coronae Australis","mean":"The Southern Crown","star":"Meridiana"},
"CrB":{"nm":"Corona Borealis","gen":"Coronae Borealis","mean":"The Northern Crown","star":"Alphecca","hemi":"Northern","season":"Summer","desc":["A graceful semicircle of stars — the crown given to Ariadne and set in the sky.","Holds the ‘Blaze Star’ T CrB, a recurrent nova that flares roughly every 80 years."],"rows":[["Shape","Arc of 7 stars"]]},
"Crv":{"nm":"Corvus","gen":"Corvi","mean":"The Crow","star":"Gienah","hemi":"Southern","season":"Spring"},
"Crt":{"nm":"Crater","gen":"Crateris","mean":"The Cup","star":"δ Crateris"},
"Cru":{"nm":"Crux","gen":"Crucis","mean":"The Southern Cross","star":"Acrux","hemi":"Southern","season":"Autumn","desc":["The smallest constellation in the sky, yet one of the most famous — the Southern Cross, a beacon for navigators below the equator.","Its long axis points toward the south celestial pole. Beside it lies the dark Coalsack Nebula."],"rows":[["Brightest","Acrux (α Cru) · 0.77"],["Deep sky","Jewel Box (NGC 4755)"]]},
"Cyg":{"nm":"Cygnus","gen":"Cygni","mean":"The Swan","star":"Deneb","hemi":"Northern","season":"Summer","desc":["The swan flying down the length of the Milky Way, also known as the Northern Cross. Deneb, its tail, marks a corner of the Summer Triangle.","Threaded with nebulae — the North America, Veil and Pelican — and the famous black hole Cygnus X-1."],"rows":[["Brightest","Deneb (α Cyg) · 1.25"],["Deep sky","Veil & North America Nebula"]]},
"Del":{"nm":"Delphinus","gen":"Delphini","mean":"The Dolphin","star":"Rotanev","hemi":"Northern","season":"Summer"},
"Dor":{"nm":"Dorado","gen":"Doradus","mean":"The Dolphinfish","star":"α Doradus","hemi":"Southern","season":"Summer","desc":["A small southern constellation that holds most of the Large Magellanic Cloud — a satellite galaxy of the Milky Way.","Within it lies the Tarantula Nebula, the most active star-forming region known in the Local Group."],"rows":[["Deep sky","Large Magellanic Cloud"]]},
"Dra":{"nm":"Draco","gen":"Draconis","mean":"The Dragon","star":"Eltanin","hemi":"Northern","season":"Summer","desc":["The dragon coiling around the north pole between the two Bears.","Thuban, its faint star, was the pole star of the ancient Egyptians who aligned the pyramids to it."],"rows":[["Notable","Thuban — ancient pole star"]]},
"Equ":{"nm":"Equuleus","gen":"Equulei","mean":"The Little Horse","star":"Kitalpha"},
"Eri":{"nm":"Eridanus","gen":"Eridani","mean":"The River","star":"Achernar","hemi":"Southern","season":"Winter","desc":["A long, winding river of stars — the second-longest constellation, meandering from near Orion deep into the southern sky.","It ends at Achernar, ‘the river's end’, a rapidly spinning, flattened star."],"rows":[["Brightest","Achernar (α Eri) · 0.45"]]},
"For":{"nm":"Fornax","gen":"Fornacis","mean":"The Furnace","star":"α Fornacis"},
"Gem":{"nm":"Gemini","gen":"Geminorum","mean":"The Twins","star":"Pollux","hemi":"Northern","season":"Winter","desc":["The twins Castor and Pollux, marked by the two bright stars that bear their names.","A zodiac constellation; the radiant of the reliable Geminid meteor shower each December."],"rows":[["Bright pair","Castor & Pollux"],["Best viewed","Dec–Feb"]]},
"Gru":{"nm":"Grus","gen":"Gruis","mean":"The Crane","star":"Alnair","hemi":"Southern","season":"Autumn"},
"Her":{"nm":"Hercules","gen":"Herculis","mean":"Hercules","star":"Kornephoros","hemi":"Northern","season":"Summer","desc":["The kneeling hero of the Twelve Labours, the fifth-largest constellation.","Its Keystone asterism frames M13, the finest globular cluster in the northern sky."],"rows":[["Deep sky","Great Cluster (M13)"]]},
"Hor":{"nm":"Horologium","gen":"Horologii","mean":"The Pendulum Clock","star":"α Horologii"},
"Hya":{"nm":"Hydra","gen":"Hydrae","mean":"The Water Snake","star":"Alphard","hemi":"Equatorial","season":"Spring","desc":["The largest constellation in the sky, a vast water-snake winding over a quarter of the way around the heavens.","Its lone bright star Alphard means ‘the solitary one’."],"rows":[["Brightest","Alphard (α Hya) · 1.98"]]},
"Hyi":{"nm":"Hydrus","gen":"Hydri","mean":"The Male Water Snake","star":"β Hydri"},
"Ind":{"nm":"Indus","gen":"Indi","mean":"The Indian","star":"α Indi"},
"Lac":{"nm":"Lacerta","gen":"Lacertae","mean":"The Lizard","star":"α Lacertae"},
"Leo":{"nm":"Leo","gen":"Leonis","mean":"The Lion","star":"Regulus","hemi":"Northern","season":"Spring","desc":["A crouching lion and one of the few constellations that truly resembles its namesake. Its head and mane form the backwards-question-mark Sickle.","A zodiac constellation on the ecliptic; the Leonid meteor shower radiates from here each November."],"rows":[["Brightest","Regulus (α Leo) · 1.40"],["Deep sky","Leo Triplet (M65/66/3628)"]]},
"LMi":{"nm":"Leo Minor","gen":"Leonis Minoris","mean":"The Lesser Lion","star":"Praecipua"},
"Lep":{"nm":"Lepus","gen":"Leporis","mean":"The Hare","star":"Arneb","hemi":"Equatorial","season":"Winter"},
"Lib":{"nm":"Libra","gen":"Librae","mean":"The Scales","star":"Zubeneschamali","hemi":"Southern","season":"Summer","desc":["The only zodiac constellation representing an object rather than a creature — the scales of justice held by neighbouring Virgo.","Its star names mean the ‘northern’ and ‘southern claw’, a memory of when these stars belonged to Scorpius."]},
"Lup":{"nm":"Lupus","gen":"Lupi","mean":"The Wolf","star":"α Lupi"},
"Lyn":{"nm":"Lynx","gen":"Lyncis","mean":"The Lynx","star":"α Lyncis","desc":["A faint, sprawling constellation said to need the eyes of a lynx to see."]},
"Lyr":{"nm":"Lyra","gen":"Lyrae","mean":"The Lyre","star":"Vega","hemi":"Northern","season":"Summer","desc":["The lyre of Orpheus. Tiny but brilliant, led by Vega — the fifth-brightest star and a corner of the Summer Triangle.","Holds the Ring Nebula (M57), a glowing smoke-ring cast off by a dying star."],"rows":[["Brightest","Vega (α Lyr) · 0.03"],["Deep sky","Ring Nebula (M57)"]]},
"Men":{"nm":"Mensa","gen":"Mensae","mean":"The Table Mountain","star":"α Mensae"},
"Mic":{"nm":"Microscopium","gen":"Microscopii","mean":"The Microscope","star":"γ Microscopii"},
"Mon":{"nm":"Monoceros","gen":"Monocerotis","mean":"The Unicorn","star":"β Monocerotis","hemi":"Equatorial","season":"Winter","desc":["A faint unicorn set among the bright winter stars, crossed by the Milky Way.","Contains the Rosette Nebula and the Christmas Tree Cluster."],"rows":[["Deep sky","Rosette Nebula"]]},
"Mus":{"nm":"Musca","gen":"Muscae","mean":"The Fly","star":"α Muscae"},
"Nor":{"nm":"Norma","gen":"Normae","mean":"The Carpenter's Square","star":"γ² Normae"},
"Oct":{"nm":"Octans","gen":"Octantis","mean":"The Octant","star":"ν Octantis","desc":["The constellation of the south celestial pole — its faint star Sigma Octantis is the southern equivalent of Polaris."]},
"Oph":{"nm":"Ophiuchus","gen":"Ophiuchi","mean":"The Serpent Bearer","star":"Rasalhague","hemi":"Equatorial","season":"Summer","desc":["The healer Asclepius wrestling a great serpent — the ‘13th sign’ of the zodiac, which the Sun passes through each year.","Holds Barnard's Star, the fastest-moving star across our sky."],"rows":[["Notable","Barnard's Star"]]},
"Ori":{"nm":"Orion","gen":"Orionis","mean":"The Hunter","star":"Rigel","hemi":"Equatorial","season":"Winter","desc":["One of the most recognisable constellations in the sky — the Hunter striding with club and shield. Its brightest stars form a vast hourglass anchored by the three-star Belt.","It straddles the celestial equator, so it is visible from nearly everywhere on Earth, dominating winter evenings."],"rows":[["Brightest","Rigel (β Ori) · 0.13"],["Notable","Betelgeuse — red supergiant"],["The Belt","Alnitak · Alnilam · Mintaka"],["Deep sky","Orion Nebula (M42)"]]},
"Pav":{"nm":"Pavo","gen":"Pavonis","mean":"The Peacock","star":"Peacock"},
"Peg":{"nm":"Pegasus","gen":"Pegasi","mean":"The Winged Horse","star":"Enif","hemi":"Northern","season":"Autumn","desc":["The winged horse sprung from the blood of Medusa. Its body is the Great Square of Pegasus, a huge signpost of the autumn sky.","Home to 51 Pegasi, the first Sun-like star found to host an exoplanet."],"rows":[["Shape","Great Square of Pegasus"],["Notable","51 Peg — first exoplanet host"]]},
"Per":{"nm":"Perseus","gen":"Persei","mean":"Perseus","star":"Mirfak","hemi":"Northern","season":"Winter","desc":["The hero who slew Medusa, holding her severed head — marked by Algol, the ‘Demon Star’, which visibly dims every 2.9 days.","Radiant of the Perseid meteor shower and home to the spectacular Double Cluster."],"rows":[["Notable","Algol — eclipsing variable"],["Deep sky","Double Cluster"]]},
"Phe":{"nm":"Phoenix","gen":"Phoenicis","mean":"The Phoenix","star":"Ankaa"},
"Pic":{"nm":"Pictor","gen":"Pictoris","mean":"The Painter's Easel","star":"α Pictoris","desc":["A faint southern constellation; its star Beta Pictoris hosts a famous dusty disk and a directly-imaged planet."]},
"Psc":{"nm":"Pisces","gen":"Piscium","mean":"The Fishes","star":"Alpherg","hemi":"Northern","season":"Autumn","desc":["Two fish tied together by their tails, swimming in opposite directions — a faint zodiac constellation.","Contains the vernal equinox, where the Sun crosses the celestial equator each spring."]},
"PsA":{"nm":"Piscis Austrinus","gen":"Piscis Austrini","mean":"The Southern Fish","star":"Fomalhaut","hemi":"Southern","season":"Autumn","desc":["The southern fish drinking the stream poured by Aquarius. Its lone bright star, Fomalhaut, gleams alone in a barren patch of autumn sky.","Fomalhaut hosts a ring of debris and was an early target in the hunt for exoplanets."],"rows":[["Brightest","Fomalhaut (α PsA) · 1.16"]]},
"Pup":{"nm":"Puppis","gen":"Puppis","mean":"The Stern","star":"Naos"},
"Pyx":{"nm":"Pyxis","gen":"Pyxidis","mean":"The Mariner's Compass","star":"α Pyxidis"},
"Ret":{"nm":"Reticulum","gen":"Reticuli","mean":"The Reticle","star":"α Reticuli"},
"Sge":{"nm":"Sagitta","gen":"Sagittae","mean":"The Arrow","star":"γ Sagittae","desc":["The third-smallest constellation — a tiny, convincing little arrow shot across the Milky Way."]},
"Sgr":{"nm":"Sagittarius","gen":"Sagittarii","mean":"The Archer","star":"Kaus Australis","hemi":"Southern","season":"Summer","desc":["The archer-centaur aiming his bow at Scorpius. Its bright stars form the ‘Teapot’ asterism.","Marks the direction of the centre of our galaxy — its star clouds and nebulae are the richest patch of the entire Milky Way."],"rows":[["Shape","The Teapot"],["Notable","Galactic Centre (Sgr A*)"]]},
"Sco":{"nm":"Scorpius","gen":"Scorpii","mean":"The Scorpion","star":"Antares","hemi":"Southern","season":"Summer","desc":["A rare constellation that looks like its namesake — a scorpion with a curving tail and a red heart, Antares, a vast supergiant whose name means ‘rival of Mars’.","The scorpion that, in myth, killed Orion; the two never share the sky."],"rows":[["Brightest","Antares (α Sco) · 1.06"],["Deep sky","M6 · M7 clusters"]]},
"Scl":{"nm":"Sculptor","gen":"Sculptoris","mean":"The Sculptor","star":"α Sculptoris"},
"Sct":{"nm":"Scutum","gen":"Scuti","mean":"The Shield","star":"α Scuti","desc":["A small constellation containing the dazzling Wild Duck Cluster (M11), one of the richest open clusters known."],"rows":[["Deep sky","Wild Duck Cluster (M11)"]]},
"Ser":{"nm":"Serpens","gen":"Serpentis","mean":"The Serpent","star":"Unukalhai","desc":["The only constellation split in two — the serpent's head (Caput) and tail (Cauda), held by Ophiuchus between them.","Home to the Eagle Nebula (M16) and its ‘Pillars of Creation’."],"rows":[["Deep sky","Eagle Nebula (M16)"]]},
"Sex":{"nm":"Sextans","gen":"Sextantis","mean":"The Sextant","star":"α Sextantis"},
"Tau":{"nm":"Taurus","gen":"Tauri","mean":"The Bull","star":"Aldebaran","hemi":"Northern","season":"Winter","desc":["The charging bull of the zodiac, its face a V-shaped cluster (the Hyades) with the orange eye Aldebaran.","Carries the Pleiades (M45) on its shoulder and the Crab Nebula (M1), a supernova seen in 1054."],"rows":[["Brightest","Aldebaran (α Tau) · 0.85"],["Deep sky","Pleiades (M45) · Crab (M1)"]]},
"Tel":{"nm":"Telescopium","gen":"Telescopii","mean":"The Telescope","star":"α Telescopii"},
"Tri":{"nm":"Triangulum","gen":"Trianguli","mean":"The Triangle","star":"β Trianguli","hemi":"Northern","season":"Autumn","desc":["A simple, slender triangle of three stars.","Holds the Triangulum Galaxy (M33), the third-largest in our Local Group and a faint naked-eye target under dark skies."],"rows":[["Deep sky","Triangulum Galaxy (M33)"]]},
"TrA":{"nm":"Triangulum Australe","gen":"Trianguli Australis","mean":"The Southern Triangle","star":"Atria"},
"Tuc":{"nm":"Tucana","gen":"Tucanae","mean":"The Toucan","star":"α Tucanae","hemi":"Southern","season":"Spring","desc":["A southern bird constellation that holds the Small Magellanic Cloud and the magnificent globular cluster 47 Tucanae."],"rows":[["Deep sky","Small Magellanic Cloud · 47 Tuc"]]},
"UMa":{"nm":"Ursa Major","gen":"Ursae Majoris","mean":"The Great Bear","star":"Alioth","hemi":"Northern","season":"Spring","desc":["The Great Bear, containing the Big Dipper (or Plough) — the most famous star pattern in the northern sky. Its two end stars point to Polaris.","Third-largest of all constellations, home to many bright galaxies including M81 and M101."],"rows":[["Asterism","The Big Dipper / Plough"],["Use","Pointer stars → Polaris"],["Deep sky","M81 · Pinwheel (M101)"]]},
"UMi":{"nm":"Ursa Minor","gen":"Ursae Minoris","mean":"The Little Bear","star":"Polaris","hemi":"Northern","season":"Year-round","desc":["The Little Bear, whose tail-tip is Polaris — the North Star, which sits almost exactly above the north pole and barely moves all night.","The Little Dipper hangs from Polaris, a ready-made clock and compass for the northern sky."],"rows":[["Brightest","Polaris (α UMi) · 1.98"],["Use","Marks true north"]]},
"Vel":{"nm":"Vela","gen":"Velorum","mean":"The Sails","star":"γ Velorum","hemi":"Southern","season":"Autumn","desc":["The sails of the ship Argo. Contains the Vela supernova remnant and a famous pulsar.","Part of the giant ‘False Cross’ sometimes mistaken for the Southern Cross."]},
"Vir":{"nm":"Virgo","gen":"Virginis","mean":"The Maiden","star":"Spica","hemi":"Equatorial","season":"Spring","desc":["The second-largest constellation, a maiden holding an ear of wheat marked by the brilliant blue star Spica.","Its bowl brims with thousands of galaxies — the heart of the Virgo Cluster.","Follow the Dipper's arc to Arcturus, then ‘spike to Spica’."],"rows":[["Brightest","Spica (α Vir) · 0.98"],["Deep sky","Virgo Cluster · Sombrero (M104)"]]},
"Vol":{"nm":"Volans","gen":"Volantis","mean":"The Flying Fish","star":"β Volantis"},
"Vul":{"nm":"Vulpecula","gen":"Vulpeculae","mean":"The Fox","star":"Anser","desc":["A faint fox below Cygnus, home to the Dumbbell Nebula (M27) — the first planetary nebula ever discovered."],"rows":[["Deep sky","Dumbbell Nebula (M27)"]]}
};
var desktop=document.getElementById('desktop'), toastEl=document.getElementById('toast'), zonesEl=document.getElementById('zones'), snapbarEl=document.getElementById('snapbar');
var WIN={}, order=[], z=10;
var emptyEl=document.getElementById('empty');
var maskCanvas=null,maskData=null,maskW=0,maskH=0;
function buildMask(w,h){if(maskCanvas&&maskW===w&&maskH===h)return;
maskCanvas=document.createElement('canvas');maskCanvas.width=w;maskCanvas.height=h;
var mc=maskCanvas.getContext('2d');mc.clearRect(0,0,w,h);mc.fillStyle='#fff';mc.textAlign='center';mc.textBaseline='middle';
var fs=Math.max(8,P.maskFs);mc.font=(P.maskFontWeight||800)+' '+fs+'px '+(P.maskFontFamily||'Inter, sans-serif');
mc.fillText(P.maskText||'',w/2,h*0.5);
maskData=mc.getImageData(0,0,w,h).data;maskW=w;maskH=h;}
function maskAt(x,y){if(x<0||y<0||x>=maskW||y>=maskH)return 0;return maskData[(((y|0)*maskW)+(x|0))*4+3];}
var HOME_SET=['hero','fetch'];
/* ---------------- app content ---------------- */
var FETCH='<pre class="logo"> ██████╗ ██╗ ██╗\n██╔════╝ ██║ ██╔╝\n██║ █████╔╝\n██║ ██╔═██╗\n╚██████╗ ██║ ██╗\n ╚═════╝ ╚═╝ ╚═╝</pre>'+
'<div class="ident">captkernel@studio</div><div class="rule">───────────────────</div>'+
'<div class="info"><div><span class="k">host</span><span class="v">Karan Parmar</span></div><div><span class="k">role</span><span class="v">solo AI builder</span></div><div><span class="k">os</span><span class="v">captKernel OS</span></div><div><span class="k">kernel</span><span class="v">6.ai-frontier</span></div><div><span class="k">shell</span><span class="v">zsh + claude</span></div><div><span class="k">repos</span><span class="v">7 public</span></div><div><span class="k">status</span><span class="v">● in the open</span></div></div>'+
'<div class="palette"><i style="background:var(--red)"></i><i style="background:var(--yellow)"></i><i style="background:var(--accent)"></i><i style="background:var(--blue)"></i><i style="background:var(--muted)"></i><i style="background:var(--text)"></i></div>';
/* ---- featured flagships (shipped, finished pieces) ---- */
/* real project logos, inlined as SVG so the site stays a single self-contained file */
var ICO_KNOB='<svg class="glyph" viewBox="0 0 64 64" width="24" height="24" aria-label="Knob"><defs><linearGradient id="kn-g" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#7b6ef0"/><stop offset="1" stop-color="#5a23b8"/></linearGradient></defs><rect x="2" y="2" width="60" height="60" rx="15" fill="url(#kn-g)"/><circle cx="32" cy="35" r="13" fill="none" stroke="#fff" stroke-width="6"/><circle cx="32" cy="22" r="4" fill="#fff"/></svg>';
var ICO_CLAUN='<svg class="glyph" viewBox="0 0 64 64" width="24" height="24" aria-label="Claunchpad"><defs><linearGradient id="cp-icon-trail" x1="0" y1="1" x2="1" y2="0"><stop offset="0" stop-color="#22c55e"/><stop offset=".5" stop-color="#5b8dee"/><stop offset="1" stop-color="#8b5cf6"/></linearGradient></defs><rect x="2" y="2" width="60" height="60" rx="15" fill="#0f1117"/><path d="M32 12 L52 40 L40 40 L40 50 L24 50 L24 40 L12 40 Z" fill="url(#cp-icon-trail)"/><rect x="22" y="54" width="20" height="4" rx="2" fill="#5b8dee"/></svg>';
/* Skills Curator — "D4b": a skill decomposed into blocks, kept parts nudged inward, the chosen one chroma-red. Art-style: Clair Obscur / decompose-select-rewrite. */
var ICO_SKILLS='<svg class="glyph" viewBox="0 0 64 64" width="24" height="24" aria-label="Skills Curator"><rect x="2" y="2" width="60" height="60" rx="15" fill="#f3ede1"/><rect x="18.1" y="18.1" width="8" height="8" rx="1.6" fill="#7a1f1f" opacity=".82"/><rect x="28" y="18.1" width="8" height="8" rx="1.6" fill="#7a1f1f" opacity=".82"/><rect x="39" y="17" width="8" height="8" rx="1.6" fill="#7a1f1f" opacity=".2"/><rect x="17" y="28" width="8" height="8" rx="1.6" fill="#7a1f1f" opacity=".2"/><rect x="28" y="28" width="8" height="8" rx="1.6" fill="#7a1f1f" opacity=".82"/><rect x="37.9" y="28" width="8" height="8" rx="1.6" fill="#d97777"/><rect x="18.1" y="37.9" width="8" height="8" rx="1.6" fill="#7a1f1f" opacity=".82"/><rect x="28" y="39" width="8" height="8" rx="1.6" fill="#7a1f1f" opacity=".2"/><rect x="37.9" y="37.9" width="8" height="8" rx="1.6" fill="#7a1f1f" opacity=".82"/></svg>';
/* ---- WIP project glyphs (custom SVG marks, muted app-tile style) ---- */
var ICO_FOOD='<svg class="glyph" viewBox="0 0 64 64" width="24" height="24" aria-label="FooFindr"><defs><linearGradient id="ff-g" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#ff7a4d"/><stop offset="1" stop-color="#e23d1f"/></linearGradient></defs><rect x="2" y="2" width="60" height="60" rx="15" fill="url(#ff-g)"/><g fill="#fff"><rect x="26" y="16" width="2.6" height="12" rx="1.3"/><rect x="30.7" y="16" width="2.6" height="12" rx="1.3"/><rect x="35.4" y="16" width="2.6" height="12" rx="1.3"/><path d="M25 27 h15 v2 a5 5 0 0 1 -5 5 h-5 a5 5 0 0 1 -5 -5 Z"/><rect x="30.7" y="33" width="3.6" height="16" rx="1.8"/></g></svg>';
var ICO_C2B='<svg class="glyph" viewBox="0 0 64 64" width="24" height="24" aria-label="Chat2Business"><defs><linearGradient id="c2-g" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#5b8dee"/><stop offset="1" stop-color="#3b3bb0"/></linearGradient></defs><rect x="2" y="2" width="60" height="60" rx="15" fill="url(#c2-g)"/><path d="M16 18 h32 a4 4 0 0 1 4 4 v15 a4 4 0 0 1 -4 4 H29 l-8 7 v-7 h-5 a4 4 0 0 1 -4 -4 V22 a4 4 0 0 1 4 -4 Z" fill="#fff"/><g fill="#3b3bb0"><rect x="21" y="31" width="4" height="6" rx="1"/><rect x="30" y="27" width="4" height="10" rx="1"/><rect x="39" y="23" width="4" height="14" rx="1"/></g></svg>';
var ICO_SWA='<svg class="glyph" viewBox="0 0 64 64" width="24" height="24" aria-label="Swadesh"><defs><linearGradient id="sw-g" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#ff9933"/><stop offset="1" stop-color="#138808"/></linearGradient></defs><rect x="2" y="2" width="60" height="60" rx="15" fill="url(#sw-g)"/><g stroke="#fff" stroke-width="2.2"><line x1="32" y1="21" x2="21" y2="43"/><line x1="32" y1="21" x2="43" y2="43"/><line x1="21" y1="43" x2="43" y2="43"/></g><g fill="#fff"><circle cx="32" cy="21" r="4.6"/><circle cx="21" cy="43" r="4.6"/><circle cx="43" cy="43" r="4.6"/></g></svg>';
var ICO_ANC='<svg class="glyph" viewBox="0 0 64 64" width="24" height="24" aria-label="ANCYR"><rect x="2" y="2" width="60" height="60" rx="15" fill="#2a201b"/><text x="32" y="43" text-anchor="middle" font-family="Georgia,\'Times New Roman\',serif" font-weight="600" font-size="34" fill="#c9a24a">A</text><rect x="22" y="47.5" width="20" height="1.6" fill="#c9a24a"/></svg>';
var ICO_KP='<svg class="glyph" viewBox="0 0 64 64" width="24" height="24" aria-label="Kids Planet"><defs><linearGradient id="kp-g" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#2bb3c0"/><stop offset="1" stop-color="#2176ae"/></linearGradient></defs><rect x="2" y="2" width="60" height="60" rx="15" fill="url(#kp-g)"/><circle cx="30" cy="33" r="12" fill="#fff"/><ellipse cx="30" cy="33" rx="19" ry="6" fill="none" stroke="#ffe08a" stroke-width="2.6" transform="rotate(-20 30 33)"/><circle cx="47" cy="19" r="2.4" fill="#ffe08a"/></svg>';
var FEATURED=[
{k:'knob',ico:ICO_KNOB,nm:'Knob',badge:'v1.0.0 · download',tag:'Windows audio + display control, one global hotkey.',
chips:['Electron','Win 11 acrylic','tray + hotkey'],
cta:[{l:'Download ↓',h:'https://github.com/captkernel/Knob/releases/latest',c:'primary'},{l:'GitHub',h:'https://github.com/captkernel/Knob',c:'ghost'}],
pitch:'A polished tray app summoned by a global hotkey (Ctrl+Alt+A). One glance, one click: switch your default speaker or mic, ride the volume slider, apply saved device profiles, and rearrange your monitors — then dismiss with the same key.',
why:'Windows makes the simple things slow — switching your mic before a call, or rearranging monitors every time you dock, means digging through Settings. I wanted one hotkey that summons everything, does the switch in a click, and disappears. It started as a personal tray tool and grew into a polished, auto-updating app.',
who:'Windows power users juggling multiple audio devices and multi-monitor setups.',
groups:[
{h:'🔊 Audio',i:['Output / input switching, friendly names + icons','Saveable device profiles, favourites, renames','Live mic-level test, Bluetooth-aware, hot-plug']},
{h:'🖥️ Display',i:['To-scale monitor layout you drag to arrange','Edge-snap, set primary, toggle a display on/off','Save & apply multi-monitor profiles in one click']},
{h:'✨ Polish',i:['Native Win 11 acrylic glass + Framer Motion','Auto-start in tray, background auto-update','Resilient rebindable hotkey with live status']}],
stack:'<b>Stack:</b> Electron · React · Tailwind · Framer Motion · NirSoft svcl / MultiMonitorTool helpers'},
{k:'skills',ico:ICO_SKILLS,nm:'Skills Curator',badge:'● live',tag:'The intelligence layer for Claude skills.',
chips:['security scan','--customize','multi-platform'],
cta:[{l:'What it does',h:'#',c:'primary',d:'skills'},{l:'GitHub',h:'https://github.com/captkernel/Skills_Curator',c:'ghost'}],
pitch:'A trust-rated catalog plus real judgment: it tells you which skills actually fit your project — your stack, deps, and CLAUDE.md — recommends with pros and cons, security-scans before you install, and persists every decision.',
why:'The Claude skills ecosystem grew faster than anyone could vet. I had no reliable way to know which skills fit my project, which were safe to install, or which I had already judged — so I built the layer that scores fit, security-scans, rewrites skills to match your project, and remembers every decision.',
who:'Claude Code and claude.ai users drowning in skills who want to install only what fits — safely.',
press:[{t:'The Man Who Taught His AI to Shut Up and Use His Voice',pub:'Strategic Tensors · Nishant Sharma',h:'https://strategictensors.substack.com/p/the-man-who-taught-his-ai-to-shut'}],
groups:[
{h:'Judges fit',i:['Recommends by fit, not popularity','Flags duplicate and conflicting skills','Per-project verdict + decision registry']},
{h:'--customize',i:['Forks any skill, rebuilds it for your project','Keeps only the parts that fit, in your voice','Infuse, not invoke']},
{h:'Everywhere',i:['Editions for Claude Code, Python, claude.ai','Migrates skills across 55+ agent platforms','Security scan on every candidate']}],
stack:'<b>Editions:</b> Claude Code · Lite (no-Python) · Python · claude.ai'},
{k:'claunchpad',ico:ICO_CLAUN,nm:'Claunchpad',badge:'● live',tag:'One skill, and Claude works like a pro — zero setup.',
chips:['persistent memory','agent teams','one-tap skills'],
cta:[{l:'See showcase',h:'https://htmlpreview.github.io/?https://github.com/captkernel/Claunchpad/blob/master/showcase.html',c:'primary'},{l:'GitHub',h:'https://github.com/captkernel/Claunchpad',c:'ghost'}],
pitch:'Drop in one skill and Claude starts working like a seasoned pro: persistent memory, agent teams that size themselves, the good ecosystem skills, and the habits that take weeks to work out. Answer one question and it runs.',
why:'On every new project I was rebuilding the same foundation by hand — persistent memory, agent structures, the good skills, the guardrails. Claunchpad packages all of it into one skill: install it, answer one question, and Claude starts working like it knows what it\'s doing.',
who:'Anyone starting a project with Claude Code — beginners who want a safe default, experts who want the full machine.',
groups:[
{h:'🧠 Memory',i:['Remembers decisions, fixed bugs, techniques','A hook reloads it at every session start','Survives /clear and context compaction']},
{h:'👥 Orchestration',i:['Teams that size themselves: solo → pair → fan-out','Escalates only when the task earns it','Knowledge passed between agents, not lost']},
{h:'🧩 Setup',i:['One-tap install of the best ecosystem skills','Tuned to you: tiny + safe, or the full machine','Councils pressure-test big, irreversible calls']}],
stack:'<b>Runs on:</b> Claude Code · claude.ai · API — pillars: Memory · Delegation · Orchestration'}
];
/* ---- in progress: building in the open ---- */
var WIP=[
{k:'foofindr',ico:ICO_FOOD,nm:'FooFindr',badge:'◐ in build',tag:'Group food ordering, gamified.',
chips:['React Native','Swiggy MCP','285 tests'],
cta:[{l:'▶ Try the beta',h:'https://foofindr-teaser.tiiny.site/',c:'primary'}],
pitch:'Friends swipe on cuisines, match on what everyone\'s actually craving, and then one person fires a single cash-on-delivery order for the whole group through a real Swiggy integration.',
why:'Deciding where to eat as a group is endless back-and-forth. FooFindr turns it into a quick, playful swipe-to-match, then collapses the ordering into one tap for the host.',
who:'Friend groups and flatmates in India ordering together.',
press:[{t:'What if Ordering Dinner Was the Game?',pub:'Strategic Tensors · Nishant Sharma',h:'https://strategictensors.substack.com/p/what-if-ordering-dinner-was-the-game'}],
groups:[
{h:'The flow',i:['Swipe on cuisines, match the group','Host places one COD order for everyone','Real Swiggy MCP integration']},
{h:'Build',i:['React Native / Expo','285 tests passing','Motion + swipe UX in progress']}],
stack:'<b>Stack:</b> React Native · Expo · Zustand · Reanimated · Swiggy MCP'},
{k:'chat2b',ico:ICO_C2B,nm:'Chat2Business',badge:'◐ scaffolding',tag:'Voice memo → validated business.',
chips:['Crew engine','AI council','voice → build'],cta:[],
pitch:'Talk a business idea into your phone and it runs the whole gauntlet automatically — captured, transcribed, structured, researched, reviewed by an AI advisory council, decided, and prototyped.',
why:'Most ideas die in the gap between a shower thought and knowing whether it is actually worth doing. Chat2Business closes that gap: say it out loud and get back honest research, a council critique, and a built prototype.',
who:'Founders and solo builders stress-testing ideas before sinking time into them.',
groups:[
{h:'Pipeline',i:['captured → transcribed → structured','researched → council-reviewed → decided','→ built (prototype)']},
{h:'Built on',i:['The reusable "Crew" agent engine','Council + deep-research skills','Voice → structure pattern']}],
stack:'<b>Stack:</b> the Crew engine · AI council · automatic voice → prototype pipeline'},
{k:'swadesh',ico:ICO_SWA,nm:'Swadesh',badge:'◐ scaffold + design',tag:'Autonomous AI company-operator, India-first.',
chips:['agent crew','UPI · GST','Hindi + regional'],cta:[],
pitch:'Type a business idea and a fleet of agents stands the company up and runs it 24/7 — wired for UPI/Razorpay, GST invoicing, WhatsApp, and Hindi plus regional languages.',
why:'The tools to run a small business in India all exist — payments, messaging, compliance — they are just fragmented and tedious. Swadesh is my bet that an agent crew can operate the whole thing, pointed at how business actually works here.',
who:'Indian solo founders and small operators who want a business run for them, not just software to run it with.',
groups:[
{h:'The crew',i:['Coordinator "AI CEO" + role agents','growth, finance, legal, CX, content, research','Instantiated per company, on demand']},
{h:'India stack',i:['UPI / Razorpay + GST invoicing','WhatsApp (native + cloud API)','Hindi + regional localisation']}],
stack:'<b>Stack:</b> the Crew engine · India execution adapters · <b>Status:</b> scaffold + design'},
{k:'ancyr',ico:ICO_ANC,nm:'ANCYR',badge:'◐ Oct 2026',tag:'An AI-native luxury Angora house.',
chips:['~26 agents','Himalayan Angora','Next.js 15'],
cta:[{l:'Visit ancyr.com',h:'https://ancyr.com',c:'primary'}],
pitch:'A luxury house working in Himalayan Angora — combed, spun, and handwoven in Kullu — built as an AI-native company. The entire operation runs on a crew of ~26 agents spanning brand, product, legal, finance, photography, copy, and web, behind a Next.js 15 storefront. Launching October 2026.',
who:'People who value ultra-premium, hand-made natural fibre — and a live proof of what an AI-native brand company looks like.',
agents:[
['Brand Guardian','guards the house codes, tone & angora ethics on every asset'],
['Product & Packaging','SKU specs, packaging, certificates, serial numbers'],
['Operations','manufacturing, QC, logistics & raw-fibre sourcing'],
['Legal','trademark, entity, GST, contracts & labeling'],
['Finance','budget, working capital, unit economics, Razorpay'],
['Financial Modeling','forward scenarios, cash flow, investment memos'],
['Photography','art direction, photographer sourcing, shoot planning'],
['Copy & Comms','the copy system, tone, product & press copy'],
['Website','the Next.js storefront: waitlist, pricing, cart, checkout'],
['Digital Infra','analytics, SEO, email/CRM, Workspace'],
['Research','competitive intel, market data & contacts'],
['Vendor Scout','sources, profiles & shortlists vendors'],
['Heritage','brand provenance & archival documentation'],
['Press / PR','press targets, outreach & placement tracking'],
['Email','drafts, checks & sends all outbound mail'],
['PMO','milestones, risks & governance'],
['Morning Briefing','a daily digest of the whole company\'s state'],
['Quality Audit','audits the other agents\' output for drift & errors']],
groups:[
{h:'The craft',i:['Himalayan Angora — combed, spun, handwoven','Made in Kullu, Himachal Pradesh','Small-batch, hand-made luxury']}],
stack:'<b>Launch:</b> October 2026 · <b>Operations:</b> ~26-agent command centre · <b>Stack:</b> Next.js 15'},
{k:'kidsplanet',ico:ICO_KP,nm:'Kids Planet',badge:'◐ live + building',tag:'Agentic AI inside a real K–8 school.',
chips:['Next.js · Supabase','Planet Studio','AI paper checker'],
cta:[{l:'Visit site',h:'https://kidsplanetkullu.com',c:'primary'}],
pitch:'A 15-year-old K–8 school in Kullu, brought online and automated: a public site plus Planet Studio — an auth-gated dashboard of 14 modules, including an AI question-paper checker — that turns the school\'s administrative grind into agentic processes.',
who:'The school\'s staff and administrators (Planet Studio) and its parents (the public site).',
groups:[
{h:'Public site',i:['Live at kidsplanetkullu.com','Playgroup → Class 8','A modern face for parents & admissions']},
{h:'Planet Studio',i:['14 auth-gated ops modules','AI paper checker + Word export','Admin tasks → agentic processes']}],
stack:'<b>Stack:</b> Next.js · Supabase · browser-direct Claude (no server storage)'}
];
function ctaHtml(b){return '<a class="'+b.c+'"'+(b.d?' data-detail="'+b.d+'" href="#"':' href="'+b.h+'" target="_blank" rel="noopener"')+'>'+b.l+'</a>';}
function cardHtml(f,cardCls){var h='<div class="'+cardCls+'" data-key="'+f.k+'"><div class="feat-top"><span class="feat-ico">'+f.ico+'</span><span class="feat-nm">'+f.nm+'</span><span class="feat-badge">'+f.badge+'</span></div><div class="feat-tag">'+f.tag+'</div><div class="feat-chips">';
f.chips.forEach(function(c){h+='<span>'+c+'</span>';});h+='</div>';
if(f.cta&&f.cta.length){h+='<div class="feat-cta">';f.cta.forEach(function(b){h+=ctaHtml(b);});h+='</div>';}
else h+='<div class="feat-more">details →</div>';
return h+'</div>';}
function featBandHtml(){var h='<div class="work-feat"><div class="feat-cap"><b>★ shipped</b> — finished, in the wild</div>';FEATURED.forEach(function(f){h+=cardHtml(f,'feat-card');});return h+'</div>';}
function wipBandHtml(){var h='<div class="work-wip"><div class="feat-cap wip"><b>◐ in progress</b> — building in the open</div>';WIP.forEach(function(f){h+=cardHtml(f,'wip-card');});return h+'</div>';}
function detailHtml(f){var h='<button class="feat-back">← all systems</button><div class="det-head"><h3>'+f.ico+' '+f.nm+' <span class="feat-badge">'+f.badge+'</span></h3><div class="det-tag">'+f.tag+'</div></div><div class="det-pitch">'+f.pitch+'</div>';
if(f.why)h+='<div class="det-why"><h4>Why I built it</h4><p>'+f.why+'</p>'+(f.who?'<p class="det-who"><b>Who it\'s for:</b> '+f.who+'</p>':'')+'</div>';
else if(f.who)h+='<div class="det-why"><p class="det-who"><b>Who it\'s for:</b> '+f.who+'</p></div>';
if(f.agents&&f.agents.length){h+='<div class="det-agents"><h4>An agent for every department</h4><div class="ag-grid">';f.agents.forEach(function(a){h+='<div class="ag"><b>'+a[0]+'</b> <span>'+a[1]+'</span></div>';});h+='</div></div>';}
if(f.groups&&f.groups.length){h+='<div class="det-grid">';f.groups.forEach(function(g){h+='<div class="det-col"><h4>'+g.h+'</h4><ul>';g.i.forEach(function(it){h+='<li>'+it+'</li>';});h+='</ul></div>';});h+='</div>';}
if(f.press&&f.press.length){h+='<div class="det-press"><h4>↗ Press & mentions</h4>';f.press.forEach(function(p){h+='<a href="'+p.h+'" target="_blank" rel="noopener"><b>'+p.t+'</b><span>'+p.pub+' ↗</span></a>';});h+='</div>';}
if(f.stack)h+='<div class="det-stack">'+f.stack+'</div>';
h+='<div class="det-cta">';(f.cta||[]).forEach(function(b){h+=ctaHtml(b);});return h+'</div>';}
/* ---- curated systems list (flagships above; ⚠ rows auto-hidden from the public site) ---- */
var WORKROWS=[
['','claude toolkits','4 public skill packs','gh','github','live'],['','alexa / hal','Claude on Echo','local','local','live'],
['','music','mic-coach app','local','local','active'],['','image-blaster','photo → 3D splat','local','local','active'],
['','memory manager','PS photo toolkit','local','local','active'],['','dashboard (PCC)','projects hub','local','local','active'],
['','captkernel.com','this site','gh','github','live'],['','accenture','AI Decision Sci Mgr','work','linkedin','current'],
['','ai-spend-defense ⚠','AI ROI calc','local','local','spec'],['','tokenloop ⚠','token analyzer','local','local','spec'],
['','shum / fAIsh ⚠','AI stylist','local','local','proto'],['','pos (duffdun) ⚠','offline POS','work','client','live'],
['','school ⚠','foundation intake','work','client','build']];
function workHtml(){var h=featBandHtml()+wipBandHtml();
h+='<div class="work-list"><div class="fhead"><span>no.</span><span>system</span><span>type</span><span>src</span><span>status</span></div>';var n=0;
WORKROWS.forEach(function(r){if(/⚠/.test(r[1]))return; /* omit private/client (⚠) items from the public site */
n++;var no=(n<10?'0':'')+n;
h+='<div class="frow"><span class="no">'+no+'</span><span class="nm">'+r[1]+'</span><span class="ty">'+r[2]+'</span><span class="src '+r[3]+'">'+r[4]+'</span><span class="st'+(r[5]==='live'?' live':'')+'">'+(r[5]==='live'?'● ':'')+r[5]+'</span></div>';});
return h+'</div><div class="work-detail" style="display:none"></div>';}
function mountWork(el){var feat=el.querySelector('.work-feat'),wip=el.querySelector('.work-wip'),list=el.querySelector('.work-list'),det=el.querySelector('.work-detail');if(!det)return;
var ALL=FEATURED.concat(WIP);
function showList(){det.style.display='none';det.innerHTML='';[feat,wip,list].forEach(function(x){if(x)x.style.display='';});}
function showDetail(k){var f=null;ALL.forEach(function(x){if(x.k===k)f=x;});if(!f)return;
det.innerHTML=detailHtml(f);[feat,wip,list].forEach(function(x){if(x)x.style.display='none';});det.style.display='';
var b=det.querySelector('.feat-back');if(b)b.addEventListener('click',showList);
det.querySelectorAll('[data-detail]').forEach(function(d){d.addEventListener('click',function(e){e.preventDefault();showDetail(d.getAttribute('data-detail'));});});}
el.querySelectorAll('.feat-card,.wip-card').forEach(function(c){c.addEventListener('click',function(e){if(e.target.closest('a'))return;showDetail(c.getAttribute('data-key'));});});
el.querySelectorAll('.work-feat [data-detail],.work-wip [data-detail]').forEach(function(d){d.addEventListener('click',function(e){e.preventDefault();e.stopPropagation();showDetail(d.getAttribute('data-detail'));});});}
var KERNEL='<div class="k-boot">[ 0.000000 ] captKernel 6.ai-frontier booting… <span class="ok">ok</span><br>[ 0.001337 ] mounting /studio … <span class="ok">ok</span> · 5 dispatches · weekly</div>'+
'<div class="k-pin"><span class="pin">★ pinned</span><div class="pt"><b>Ship an AI tool in a weekend</b><span>the free playbook — my exact process.</span></div><div class="get">Get it free →</div></div>'+
'<div class="k-sig"><span class="pin sig">◂ signal</span> who\'s talking about the work</div>'+
'<a class="k-row k-ext" href="https://strategictensors.substack.com/p/what-if-ordering-dinner-was-the-game" target="_blank" rel="noopener"><span class="ts">[ 2026.06.21 ]</span><span class="tag press">press</span><span class="ti">"What if Ordering Dinner Was the Game?"<span>Strategic Tensors · Nishant Sharma — on FooFindr ↗</span></span></a>'+
'<a class="k-row k-ext" href="https://strategictensors.substack.com/p/the-man-who-taught-his-ai-to-shut" target="_blank" rel="noopener"><span class="ts">[ 2026.05.28 ]</span><span class="tag press">press</span><span class="ti">"The Man Who Taught His AI to Shut Up and Use His Voice"<span>Strategic Tensors · Nishant Sharma — on Skills Curator ↗</span></span></a>'+
'<div class="k-row"><span class="ts">[ 2026.06.21 ]</span><span class="tag build">build</span><span class="ti">shipped: skills-curator<span>evaluate Claude Code skills before install.</span></span></div>'+
'<a class="k-row k-ext" href="https://foofindr-teaser.tiiny.site/" target="_blank" rel="noopener"><span class="ts">[ 2026.06.21 ]</span><span class="tag beta">beta</span><span class="ti">FooFindr — swipe, match, eat<span>join the beta & watch the teaser ↗</span></span></a>'+
'<div class="k-row"><span class="ts">[ 2026.06.07 ]</span><span class="tag play">playbook</span><span class="ti">Shipping AI products solo: my stack<span>move faster than a team.</span></span></div>'+
'<div class="k-row"><span class="ts">[ 2026.05.24 ]</span><span class="tag note">note</span><span class="ti">Agents that actually do work<span>beyond demos.</span></span></div>'+
'<div class="k-row"><span class="ts">[ 2026.04.28 ]</span><span class="tag open">open</span><span class="ti">Why I build in the open<span>document everything.</span></span></div>'+
'<div class="k-sub"><span class="t">Boot <b>The Kernel</b> into your inbox — weekly.</span><form onsubmit="return false"><input placeholder="you@email.com"><button>Subscribe</button></form></div>';
var APPS={
hero:{icon:'⌂',title:'hero',w:520,h:340,cls:'w-hero',html:'<div class="eyebrow">// solo AI studio · building in the open</div><h1>I build<br>with <span class="ai">AI.</span></h1><p class="sub">captKernel is where I build autonomous agents, developer tools, and the products that grow out of them — solo, and in the open.</p><div class="ctas"><a class="btn primary" data-open="work">Explore the work</a><a class="btn ghost" data-open="connect">Work with me →</a></div>'},
term:{icon:'▸',title:'captkernel — zsh',w:520,h:300,cls:'w-term',html:'<div class="termout"><div class="ln o">captKernel shell. type <span class="hl">help</span>, or ask — e.g. <span class="cy">"what can you build for me?"</span></div></div><div class="terminline"><span class="p">captkernel:~$</span><input autocomplete="off" spellcheck="false"></div>'},
fetch:{icon:'◐',title:'fastfetch',w:340,h:360,cls:'w-fetch',html:FETCH},
about:{icon:'◎',title:'~/about.md',w:480,h:440,cls:'w-about',html:'<div class="ab-id"><span class="ab-nm">Karan Parmar</span><span class="ab-hn">captkernel</span></div>'+
'<div class="ab-role">Solo AI builder — I direct, agents build.</div>'+
'<div class="ab-meta">AI Decision Science Manager @ Accenture (GenAI) · building captKernel in the open</div>'+
'<p class="ab-bio">I\'m more a director than a hands-on coder: I describe what I want, agents build it, and I review and ship — moving at the speed of ideas instead of the speed of typing. captKernel is my one-person AI studio, where I build autonomous agents, developer tools, and AI-native products, and document the whole thing in the open.</p>'+
'<div class="ab-bet"><div class="cm"># the bet</div><div class="big vbig"></div></div>'+
'<div class="ab-h">what i\'m building toward</div>'+
'<div class="ab-row"><b>AI-native companies</b><span>ANCYR — a luxury Angora house run by ~26 agents · Swadesh — an autonomous company-operator</span></div>'+
'<div class="ab-row"><b>Agentic automation of real work</b><span>Kids Planet — my family\'s 15-year-old school · FooFindr — group ordering</span></div>'+
'<div class="ab-row"><b>Tools for the agent era</b><span>Skills Curator · Claunchpad · Knob</span></div>'+
'<div class="ab-now"><span class="dot"></span> building autonomous agents · shipping weekly · writing The Kernel</div>'},
work:{icon:'▦',title:'~/systems — all work',w:640,h:460,cls:'w-work',html:workHtml()},
kernel:{icon:'✎',title:'The Kernel — dmesg',w:560,h:440,cls:'w-kernel',html:KERNEL},
connect:{icon:'✉',title:'~/connect',w:420,h:240,cls:'w-conn',html:'<a class="row" href="https://github.com/captkernel" target="_blank" rel="noopener"><span class="k">github</span><span class="v">github.com/captkernel →</span></a><a class="row" href="https://x.com/captkernel" target="_blank" rel="noopener"><span class="k">x</span><span class="v">@captkernel →</span></a><a class="row" href="https://www.linkedin.com/in/karanparmar99" target="_blank" rel="noopener"><span class="k">linkedin</span><span class="v">in/karanparmar99 →</span></a><a class="row" data-open="kernel"><span class="k">newsletter</span><span class="v">The Kernel →</span></a>'}
};
/* macOS-mode window titles (Linux/Windows metaphors → Mac apps); icon is hidden in the mac title bar */
var MAC_TITLES={hero:'captKernel',term:'Terminal — zsh',fetch:'About This Mac',about:'About — Karan Parmar',work:'Finder — Systems',kernel:'The Kernel',connect:'Contacts — connect'};
Object.keys(MAC_TITLES).forEach(function(k){if(APPS[k])APPS[k].mtitle=MAC_TITLES[k];});
function toast(m){toastEl.textContent=m;toastEl.style.opacity='1';clearTimeout(toast._t);toast._t=setTimeout(function(){toastEl.style.opacity='0';},1600);}
/* ---------------- layout (auto-tile fill) ---------------- */
function tiled(){return order.filter(function(id){var w=WIN[id];return w&&!w.min&&!w.float;});}
function tiledUnder(px,py,selfId){var hit=null;order.forEach(function(o){if(o===selfId)return;var w=WIN[o];if(!w||w.min||w.float)return;
var r=w.el.getBoundingClientRect();if(px>=r.left&&px<=r.right&&py>=r.top&&py<=r.bottom)hit=o;});return hit;}
function applyHome(){
var W=desktop.clientWidth,H=desktop.clientHeight,g=12;
var cw=W-3*g, ch=H-2*g, fw=Math.max(240,cw*0.15), hw=cw-fw, x2=g+hw+g;
setRect(WIN.hero,g,g,hw,ch); /* left — wide hero */
setRect(WIN.fetch,x2,g,fw,ch); /* right — narrow fastfetch */
}
/* opening term/work/kernel from home: hero+fastfetch stack down a narrow left rail, the app fills the right */
function applyAppHome(other){
var W=desktop.clientWidth,H=desktop.clientHeight,g=12;
var lw=Math.max(300,(W-3*g)*0.33), rw=(W-3*g)-lw, x2=g+lw+g;
var ch=H-2*g, avail=ch-g;
var hh=Math.max(320,avail-500), fh=avail-hh; if(fh<500){fh=500;hh=avail-500;} /* fastfetch min height fits its content (no scrollbar); hero takes the rest */
var y2=g+hh+g;
setRect(WIN.hero,g,g,lw,hh); /* left rail — hero on top */
setRect(WIN.fetch,g,y2,lw,fh); /* left rail — fastfetch below */
setRect(WIN[other],x2,g,rw,ch); /* right — the opened app, full height */
}
/* opening connect from home: keep the home top (hero wide + fastfetch narrow), connect as a full-width bottom banner */
function applyConnectHome(){
var W=desktop.clientWidth,H=desktop.clientHeight,g=12;
var cw=W-3*g, fw=Math.max(240,cw*0.26), hw=cw-fw, x2=g+hw+g;
var th=Math.max(220,(H-3*g)*0.70), bh=(H-3*g)-th, y2=g+th+g;
setRect(WIN.hero,g,g,hw,th); /* top-left — wide hero */
setRect(WIN.fetch,x2,g,fw,th); /* top-right — narrow fastfetch */
setRect(WIN.connect,g,y2,W-2*g,bh); /* bottom — full-width connect banner */
}
/* home + one app + connect: hero/fastfetch left rail, the app in the middle, connect as a narrow right column */
function applyRailMainConnect(other){
var W=desktop.clientWidth,H=desktop.clientHeight,g=12;
var avail=W-4*g, lw=Math.max(300,avail*0.37), cw2=Math.max(280,avail*0.25), mw=avail-lw-cw2;
var x2=g+lw+g, x3=x2+mw+g;
var ch=H-2*g, avail=ch-g;
var hh=Math.max(320,avail-500), fh=avail-hh; if(fh<500){fh=500;hh=avail-500;} /* fastfetch min height fits its content (no scrollbar); hero takes the rest */
var y2=g+hh+g;
setRect(WIN.hero,g,g,lw,hh); /* left rail — hero on top */
setRect(WIN.fetch,g,y2,lw,fh); /* left rail — fastfetch below */
setRect(WIN[other],x2,g,mw,ch); /* middle — the opened app, full height */
setRect(WIN.connect,x3,g,cw2,ch); /* right — narrow connect column */
}
function relayout(){
var ids=tiled(),n=ids.length;if(!n)return;
if(n===2 && HOME_SET.every(function(k){return ids.indexOf(k)>=0;})){return applyHome();}
if(n===3 && ids.indexOf('hero')>=0 && ids.indexOf('fetch')>=0){ /* home + one app → image-7 / image-8 base layouts */
var other=ids.filter(function(k){return k!=='hero'&&k!=='fetch';})[0];
if(other==='connect')return applyConnectHome();
return applyAppHome(other);
}
if(n===4 && ids.indexOf('hero')>=0 && ids.indexOf('fetch')>=0 && ids.indexOf('connect')>=0){ /* home + one app + connect → image-9 */
var mid=ids.filter(function(k){return k!=='hero'&&k!=='fetch'&&k!=='connect';})[0];
return applyRailMainConnect(mid);
}
var W=desktop.clientWidth,H=desktop.clientHeight,g=12;
var cols=Math.ceil(Math.sqrt(n)),rows=Math.ceil(n/cols),idx=0;
for(var r=0;r<rows;r++){
var inRow=Math.min(cols,n-idx);
var ch=(H-g*(rows+1))/rows,y=g+r*(ch+g);
var cw=(W-g*(inRow+1))/inRow;
for(var c=0;c<inRow;c++){var x=g+c*(cw+g);setRect(WIN[ids[idx]],x,y,cw,ch);idx++;}
}
}
function setRect(w,x,y,wd,ht){w.x=x;w.y=y;w.w=wd;w.h=ht;w.el.style.left=x+'px';w.el.style.top=y+'px';w.el.style.width=wd+'px';w.el.style.height=ht+'px';}
/* ---------------- open / focus / close / min ---------------- */
function focus(id){var w=WIN[id];if(!w)return;w.el.style.zIndex=++z;order.forEach(function(o){WIN[o]&&WIN[o].el.classList.toggle('focused',o===id);});}
function openApp(id){
if(id==='home'){HOME_SET.forEach(function(k){if(!WIN[k])openApp(k);else{WIN[k].min=false;WIN[k].float=false;WIN[k].el.style.display='';}});relayout();markRun();return;}
var a=APPS[id];if(!a)return;
var w=WIN[id];
if(w){ if(w.min){w.min=false;w.el.style.display='';requestAnimationFrame(function(){w.el.classList.remove('minimizing');});} focus(id); relayout(); markRun(); return; }
var el=document.createElement('div');el.className='win '+a.cls+' opening';el.style.zIndex=++z;
var mt=(MAC()&&a.mtitle)?a.mtitle:a.title;
el.innerHTML='<div class="wbar"><span class="ic">'+a.icon+'</span><span class="name">'+mt+'</span><span class="ctrls"><span class="c-min" title="minimize">—</span><span class="c-max" title="maximize">▢</span><span class="c-x" title="close">✕</span></span></div><div class="wbody">'+a.html+'</div><div class="g g-n"></div><div class="g g-s"></div><div class="g g-e"></div><div class="g g-w"></div><div class="g g-ne"></div><div class="g g-nw"></div><div class="g g-sw"></div><div class="g g-se"></div>';
desktop.appendChild(el);
WIN[id]={el:el,min:false,float:false,x:0,y:0,w:a.w,h:a.h};order.push(id);
wire(id);relayout();focus(id);markRun();
el.addEventListener('animationend',function(){el.classList.remove('opening');},{once:true});
}
function closeApp(id){var w=WIN[id];if(!w)return;w.el.classList.add('closing');
setTimeout(function(){w.el.remove();delete WIN[id];order=order.filter(function(o){return o!==id;});relayout();markRun();},200);}
function minApp(id){var w=WIN[id];if(!w)return;w.el.classList.add('minimizing');w.min=true;w.float=false;
setTimeout(function(){w.el.style.display='none';w.el.classList.remove('minimizing');relayout();},280);markRun();}
function markRun(){document.querySelectorAll('.dock .app[data-open]').forEach(function(a){var k=a.getAttribute('data-open');
var on=(k==='home')?HOME_SET.some(function(x){return WIN[x]&&!WIN[x].min;}):(WIN[k]&&!WIN[k].min);a.classList.toggle('run',!!on);});updateEmpty();}
/* ---------------- wiring: drag move + resize + snap ---------------- */
function wire(id){
var w=WIN[id],el=w.el,bar=el.querySelector('.wbar');
el.addEventListener('pointerdown',function(){focus(id);});
bar.querySelector('.c-x').addEventListener('click',function(e){e.stopPropagation();closeApp(id);});
bar.querySelector('.c-min').addEventListener('click',function(e){e.stopPropagation();minApp(id);});
bar.querySelector('.c-max').addEventListener('click',function(e){e.stopPropagation();maximize(id);});
bar.addEventListener('dblclick',function(){w.float=false;relayout();});
/* move */
bar.addEventListener('pointerdown',function(e){
if(e.target.closest('.ctrls'))return;e.preventDefault();bar.setPointerCapture(e.pointerId);
var sx=e.clientX,sy=e.clientY,ox=el.offsetLeft,oy=el.offsetTop;var moved=false;
function mv(ev){var dx=ev.clientX-sx,dy=ev.clientY-sy;if(!moved&&Math.abs(dx)+Math.abs(dy)<4)return;
if(!moved){moved=true;w.float=true;el.classList.add('drag','float');focus(id);relayout();}
el.style.left=(ox+dx)+'px';el.style.top=(oy+dy)+'px';updateSnap(ev.clientX,ev.clientY);}
function up(ev){bar.releasePointerCapture(e.pointerId);bar.removeEventListener('pointermove',mv);bar.removeEventListener('pointerup',up);
el.classList.remove('drag');
if(!moved){clearSnap();return;}
if(snapArmed&&snapTarget){if(MAC()){var sw=WIN[id];sw.float=true;applyRect(sw,{x:snapTarget.x,y:snapTarget.y,w:snapTarget.w,h:snapTarget.h});focus(id);}else snapInto(snapArmed,id,snapTarget.i);clearSnap();return;} /* mac: snap dragged window to the edge zone; linux: arrange all windows */
clearSnap();
var tgt=tiledUnder(ev.clientX,ev.clientY,id); /* dropped onto another tile -> swap places */
if(tgt){var i=order.indexOf(id),j=order.indexOf(tgt);order[i]=tgt;order[j]=id;}
w.float=false;relayout(); /* re-join the tiling, rearranged */
}
bar.addEventListener('pointermove',mv);bar.addEventListener('pointerup',up);
});
/* 8-way resize — window floats, the rest re-tile to fill */
['n','s','e','w','ne','nw','sw','se'].forEach(function(dir){
var grip=el.querySelector('.g-'+dir);if(!grip)return;
grip.addEventListener('pointerdown',function(e){e.preventDefault();e.stopPropagation();grip.setPointerCapture(e.pointerId);
var sx=e.clientX,sy=e.clientY,ox=el.offsetLeft,oy=el.offsetTop,ow=el.offsetWidth,oh=el.offsetHeight,minW=240,minH=140;