-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
1050 lines (998 loc) · 73.8 KB
/
Copy pathindex.html
File metadata and controls
1050 lines (998 loc) · 73.8 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">
<title>Bio-Babel — The classics of bioinformatics, in more than one tongue</title>
<meta name="description" content="Bio-Babel is an AI-assisted community working out how to carry a library across a language boundary with its semantics intact — a problem particular to no pair of languages. The pair we are proving it on is R to Python: 17 classics, rebuilt in pure Python.">
<meta name="theme-color" content="#08090D">
<link rel="icon" href="assets/img/favicon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="assets/img/logo-tile.svg">
<link rel="stylesheet" href="assets/css/styles.css">
<meta property="og:type" content="website">
<meta property="og:title" content="Bio-Babel — the classics, in more than one tongue">
<meta property="og:description" content="An AI-assisted community working out how to carry a library across a language boundary with its semantics and stewardship intact. Proving it on R to Python: 17 classics, rebuilt in pure Python.">
<meta property="og:url" content="https://bio-babel.github.io/">
<meta property="og:image" content="https://bio-babel.github.io/assets/img/og-card.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Bio-Babel — the classics of bioinformatics, in more than one tongue">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://bio-babel.github.io/assets/img/og-card.png">
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<!-- ══════════════════════════════════════════════════════════════ NAV ═══ -->
<header class="nav" id="nav">
<div class="nav__inner">
<a class="brand" href="#top" aria-label="Bio-Babel home">
<img class="brand__mark" src="assets/img/logo-mark.svg" alt="" width="34" height="34">
<span class="brand__word">Bio<i>-</i>Babel</span>
</a>
<nav class="nav__links" id="navLinks" aria-label="Primary">
<a href="#why">Why</a>
<a href="#stack">The Stack</a>
<a href="#libraries">Libraries</a>
<a href="#tooling">Tooling</a>
<a href="#join">Community</a>
</nav>
<div class="nav__actions">
<a class="btn btn--ghost nav__gh" href="https://github.com/Bio-Babel" target="_blank" rel="noopener">
<svg viewBox="0 0 16 16" width="15" height="15" aria-hidden="true" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
GitHub
</a>
<button class="nav__burger" id="navBurger" aria-label="Toggle navigation" aria-expanded="false">
<span></span><span></span><span></span>
</button>
</div>
</div>
</header>
<main id="main">
<span id="top"></span>
<!-- ═════════════════════════════════════════════════════════════ HERO ═══ -->
<section class="hero">
<div class="hero__bg" aria-hidden="true">
<div class="hero__grid"></div>
<div class="hero__glow hero__glow--a"></div>
<div class="hero__glow hero__glow--b"></div>
<img class="hero__ghost" src="assets/img/logo-mark-ghost.svg" alt="">
<div class="hero__vignette"></div>
</div>
<div class="wrap hero__inner">
<a class="pill" href="#libraries">
<span class="pill__dot"></span>
17 libraries live on PyPI
<span class="pill__sep"></span>
<span class="pill__mono">biobabel 1.1.0</span>
<span class="pill__arrow">→</span>
</a>
<h1 class="hero__title">
The classics of bioinformatics,<br>
<em>in more than one tongue.</em>
</h1>
<p class="hero__sub">
Scientific software gets locked in the language it was written in. A bridge like
<code>rpy2</code> lets an agent <em>call</em> an R tool; it does not let anyone
<strong>extend or build on it natively</strong> — and the classics go unmaintained as their
language and dependencies move on.
</p>
<p class="hero__sub">
Bio-Babel rebuilds them natively in the target ecosystem, and ships each package with a
<strong>machine-readable contract</strong> so an agent that has never seen it still calls it
correctly. Nothing in that is specific to R, or to graphics.
<strong>R → Python</strong> is where we are proving it: seventeen classics so far,
each its own repository and its own caretaker.
</p>
<div class="hero__cta">
<a class="btn btn--solid" href="#libraries">Browse the libraries</a>
<a class="btn btn--outline" href="#stack">See the architecture</a>
</div>
<button class="copychip" data-copy="pip install rgrid-python ggplot2-python biobabel">
<span class="copychip__prompt">$</span>
<code>pip install rgrid-python ggplot2-python biobabel</code>
<span class="copychip__icon" aria-hidden="true">
<svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</span>
<span class="copychip__ok">copied</span>
</button>
<p class="hero__verse">
“And the whole earth was of one language, and of one speech.”
<span>Genesis 11:1</span>
</p>
</div>
</section>
<!-- ════════════════════════════════════════════════════════════ STATS ═══ -->
<section class="stats" aria-label="Project at a glance">
<div class="wrap stats__grid">
<div class="stat"><b data-count="17">17</b><span>libraries stewarded</span></div>
<div class="stat"><b data-count="1606">1,606</b><span>contracted symbols</span></div>
<div class="stat"><b data-count="21">21</b><span>public repositories</span></div>
<div class="stat"><b data-count="0">0</b><span>runtime bridges</span></div>
</div>
</section>
<!-- ══════════════════════════════════════════════════════════════ WHY ═══ -->
<section class="section" id="why">
<div class="wrap">
<p class="eyebrow">Why Babel</p>
<h2 class="h2">Translation became impossible.<br>That is the part we are fixing.</h2>
<p class="lede">
The punishment in the story was never <em>difference</em> — a field's diversity of thought is
its wealth. It was that ideas could no longer travel. Bioinformatics lives a small version of
that: a beautiful tool blooms on one side of the language line, and the half of the field on
the other side can reach across for it at best — never build on it.
</p>
<div class="cards cards--3">
<article class="card">
<div class="card__ico card__ico--violet">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M4 7h6M4 12h4M4 17h6"/><path d="M20 7h-6M20 12h-4M20 17h-6"/><path d="M12 3v18" stroke-dasharray="2 3"/></svg>
</div>
<h3>Locked in the source language</h3>
<p>
Callable from another language, but not natively extended or built upon. A bridge gets you
the call and nothing more: you cannot write a new geom against a tool you reach through
<code>rpy2</code>, and you cannot compose it with anything native. The tool is reachable
and still stranded.
</p>
</article>
<article class="card">
<div class="card__ico card__ico--gold">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M12 3.5 21 19H3L12 3.5Z"/><path d="M12 10v4.2M12 16.6h.01"/></svg>
</div>
<h3>The behaviour is not in the signature</h3>
<p>
It is in the object system, the data containers, the numerical conventions, the ecosystem
dependencies. Match every signature and a reimplementation will still run while
<em>silently diverging</em> — or run correctly while sitting outside the idioms of the
ecosystem it now belongs to.
</p>
</article>
<article class="card">
<div class="card__ico card__ico--cyan">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M6.5 4h8L19 8.5V20a1 1 0 0 1-1 1H6.5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1Z"/><path d="M14 4v5h5"/><path d="M8.6 13.4h6.8M8.6 16.6h4.4"/></svg>
</div>
<h3>Fidelity and usability are separate problems</h3>
<p>
The rebuild has to behave like the original. And an agent that has never seen it has to
use it correctly. Neither implies the other — a faithful port whose API the model has to
guess at fails just as hard. So every package ships a <code>_biobabel/</code> contract
alongside the implementation.
</p>
</article>
</div>
</div>
</section>
<!-- ════════════════════════════════════════════════════════════ STACK ═══ -->
<section class="section section--alt" id="stack">
<div class="wrap">
<p class="eyebrow">The Stack</p>
<h2 class="h2">One lineage, rebuilt from the ground up.</h2>
<p class="lede">
The visualization stack is the first worked example: R's <code>grid → {gtable, scales} → ggplot2</code>
chain and everything downstream of it, carried into pure Python on a Cairo backend.
No <code>matplotlib</code>. Publication-quality output by construction — and one
self-consistent API for an agent to reason about, instead of four.
</p>
<div class="zig">
<div class="zig__tower" id="zigTower">
<button class="zig__tier zig__tier--spire" data-tier="agents">
<span class="zig__label">Agents & contracts</span>
</button>
<button class="zig__tier" data-tier="analysis" style="--w:58%">
<span class="zig__label">Analysis</span><span class="zig__n">6</span>
</button>
<button class="zig__tier" data-tier="ext" style="--w:72%">
<span class="zig__label">Extensions</span><span class="zig__n">7</span>
</button>
<button class="zig__tier" data-tier="grammar" style="--w:86%">
<span class="zig__label">Grammar</span><span class="zig__n">1</span>
</button>
<button class="zig__tier" data-tier="foundation" style="--w:100%">
<span class="zig__label">Foundation</span><span class="zig__n">3</span>
</button>
</div>
<div class="zig__panel" id="zigPanel">
<div class="zig__detail" data-tier="foundation">
<p class="zig__kicker">Tier 1 · Foundation</p>
<h3>The graphics engine itself</h3>
<p>R's <code>grid</code> — viewports, grobs, units, the whole device model — reimplemented
on Cairo, plus the <code>scales</code> transform/break/palette machinery and the
<code>gtable</code> layout algebra. Everything above stands on these three.</p>
<ul class="zig__pkgs">
<li><code>grid_py</code><span>261 symbols</span></li>
<li><code>scales</code><span>226 symbols</span></li>
<li><code>gtable_py</code><span>21 symbols</span></li>
</ul>
</div>
<div class="zig__detail" data-tier="grammar">
<p class="zig__kicker">Tier 2 · Grammar</p>
<h3>The grammar of graphics, whole</h3>
<p>geoms, stats, scales, facets, coords, themes and guides — composed with <code>+</code>,
exactly as in R. The largest single contract in the project, and the one an agent is most
likely to hallucinate against.</p>
<ul class="zig__pkgs">
<li><code>ggplot2_py</code><span>626 symbols · 18 concepts · 30 idioms</span></li>
</ul>
</div>
<div class="zig__detail" data-tier="ext">
<p class="zig__kicker">Tier 2–3 · Extensions</p>
<h3>The ecosystem that grew on top</h3>
<p>The extension packages that make R plots publication-ready: repelled labels, alluvial
flows, independent scales, facet surgery, plot composition and the two heatmap standards
of genomics.</p>
<ul class="zig__pkgs">
<li><code>patchwork</code><span>compose with <code>|</code> and <code>/</code></span></li>
<li><code>complexheatmap</code><span>annotated heatmap lists</span></li>
<li><code>ggrepel_py</code><span>non-overlapping labels</span></li>
<li><code>ggalluvial</code><span>flow diagrams</span></li>
<li><code>ggh4x</code><span>facet & axis hooks</span></li>
<li><code>ggnewscale</code><span>multiple colour scales</span></li>
<li><code>pheatmap</code><span>clustered heatmaps</span></li>
</ul>
</div>
<div class="zig__detail" data-tier="analysis">
<p class="zig__kicker">Tier 2–3 · Analysis</p>
<h3>The methods people actually cite</h3>
<p>Single-cell trajectories, intercellular communication, CNV calling. These build their
<em>entire</em> visualization layer on the tiers below — so a Monocle 2 trajectory plot
renders like the R tutorial without adapter code.</p>
<ul class="zig__pkgs">
<li><code>monocle2py</code><span>DDRTree · BEAM · pseudotime</span></li>
<li><code>monocle3</code><span>AnnData-native trajectories</span></li>
<li><code>nichenetr</code><span>ligand → target modelling</span></li>
<li><code>tradeseq</code><span>NB-GAM lineage DE</span></li>
<li><code>copykat</code><span>CNV aneuploidy detection</span></li>
<li><code>ddrtree</code><span>reversed graph embedding</span></li>
</ul>
</div>
<div class="zig__detail" data-tier="agents">
<p class="zig__kicker">The spire</p>
<h3>What reaches the agent</h3>
<p>Every tier below publishes a <code>_biobabel/</code> contract through a Python entry
point. <code>biobabel</code> discovers them and serves 12 read-only tools over MCP to
Claude Code, Cursor, Codex and Continue. It runs no business logic and never executes
code.</p>
<ul class="zig__pkgs">
<li><code>biobabel</code><span>contract registry + MCP server</span></li>
</ul>
</div>
</div>
</div>
<!-- pipeline -->
<div class="flow">
<h3 class="flow__title">How a library becomes agent-legible</h3>
<ol class="flow__steps">
<li class="flow__step">
<span class="flow__n">01</span>
<h4>Port</h4>
<p>A controller drives coding agents through a 13-step workflow — preparation,
implementation, validation. Implementation operates on the <em>package</em>, not the
function: the whole export surface is resolved into a dependency graph and cut into
slices, each built and tested only after the ones it depends on.</p>
</li>
<li class="flow__step">
<span class="flow__n">02</span>
<h4>Annotate</h4>
<p>An agent writes each package's <code>_biobabel/</code> contract from that package's
own source, never from a neighbour's. Seven deterministic checks gate it — among them that
every public export is covered, and that each anti-pattern's detector fires on its own bad
example and stays silent on the good one.</p>
</li>
<li class="flow__step">
<span class="flow__n">03</span>
<h4>Serve</h4>
<p><code>biobabel</code> enumerates one Python entry-point group — no central registry —
and serves what it finds as 12 read-only MCP tools. An agent sees exactly the packages the
user has installed; a package without a contract is invisible.</p>
</li>
</ol>
</div>
</div>
</section>
<!-- ════════════════════════════════════════════════════════ LIBRARIES ═══ -->
<section class="section" id="libraries">
<div class="wrap">
<p class="eyebrow">The catalog</p>
<h2 class="h2">Seventeen classics, on PyPI today.</h2>
<p class="lede">
Each is its own repository, its own distribution, its own maintainer. Versions track the
upstream R package — <code>rgrid-python 4.5.3.post6</code> tracks R <code>grid</code> 4.5.3;
a Python-side fix without an R bump becomes a PEP 440 <code>.postN</code>.
</p>
<div class="filters" role="tablist" aria-label="Filter libraries">
<button class="filters__btn is-active" data-filter="all" role="tab" aria-selected="true">All <span>17</span></button>
<button class="filters__btn" data-filter="foundation" role="tab" aria-selected="false">Foundation <span>3</span></button>
<button class="filters__btn" data-filter="grammar" role="tab" aria-selected="false">Grammar <span>1</span></button>
<button class="filters__btn" data-filter="ext" role="tab" aria-selected="false">Extensions <span>7</span></button>
<button class="filters__btn" data-filter="analysis" role="tab" aria-selected="false">Analysis <span>6</span></button>
</div>
<div class="libs" id="libGrid">
<article class="lib" data-group="foundation">
<header class="lib__top">
<span class="lib__badge lib__badge--foundation">Foundation</span>
<span class="lib__tier">tier 1</span>
</header>
<h3 class="lib__name">rgrid-python</h3>
<p class="lib__from">ports R <code>grid</code> · imports as <code>grid_py</code></p>
<p class="lib__blurb">R's grid graphics engine — viewports, grobs, units, the device model — reimplemented on a Cairo backend. The floor everything else stands on.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>261</b> symbols</span>
<span class="lib__meta lib__meta--v">v4.5.3.post6</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/rgrid-python" target="_blank" rel="noopener" aria-label="rgrid-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/rgrid-python/" target="_blank" rel="noopener" aria-label="rgrid-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install rgrid-python" title="pip install rgrid-python">
<span>pip install rgrid-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="foundation">
<header class="lib__top">
<span class="lib__badge lib__badge--foundation">Foundation</span>
<span class="lib__tier">tier 1</span>
</header>
<h3 class="lib__name">scales-python</h3>
<p class="lib__from">ports R <code>scales</code> · imports as <code>scales</code></p>
<p class="lib__blurb">Breaks, labels, transforms and palettes. The scale machinery the grammar depends on, down to the tick-placement heuristics.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>226</b> symbols</span>
<span class="lib__meta lib__meta--v">v1.4.0.9000.post3</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/scales-python" target="_blank" rel="noopener" aria-label="scales-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/scales-python/" target="_blank" rel="noopener" aria-label="scales-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install scales-python" title="pip install scales-python">
<span>pip install scales-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="foundation">
<header class="lib__top">
<span class="lib__badge lib__badge--foundation">Foundation</span>
<span class="lib__tier">tier 1</span>
</header>
<h3 class="lib__name">gtable-python</h3>
<p class="lib__from">ports R <code>gtable</code> · imports as <code>gtable_py</code></p>
<p class="lib__blurb">Layout tables of grobs — the skeleton a plot is assembled into: panels, axes, strips and guides.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>21</b> symbols</span>
<span class="lib__meta lib__meta--v">v0.3.6.9000.post1</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/gtable-python" target="_blank" rel="noopener" aria-label="gtable-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/gtable-python/" target="_blank" rel="noopener" aria-label="gtable-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install gtable-python" title="pip install gtable-python">
<span>pip install gtable-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="grammar">
<header class="lib__top">
<span class="lib__badge lib__badge--grammar">Grammar</span>
<span class="lib__tier">tier 2</span>
</header>
<h3 class="lib__name">ggplot2-python</h3>
<p class="lib__from">ports R <code>ggplot2</code> · imports as <code>ggplot2_py</code></p>
<p class="lib__blurb">The grammar of graphics, whole. geoms, stats, scales, facets, coords, themes and guides — composed with <code>+</code>, exactly as in R.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>626</b> symbols</span>
<span class="lib__meta lib__meta--v">v4.0.2.9000.post7</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/ggplot2-python" target="_blank" rel="noopener" aria-label="ggplot2-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/ggplot2-python/" target="_blank" rel="noopener" aria-label="ggplot2-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install ggplot2-python" title="pip install ggplot2-python">
<span>pip install ggplot2-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="ext">
<header class="lib__top">
<span class="lib__badge lib__badge--ext">Extension</span>
<span class="lib__tier">tier 3</span>
</header>
<h3 class="lib__name">patchwork-python</h3>
<p class="lib__from">ports R <code>patchwork</code> · imports as <code>patchwork</code></p>
<p class="lib__blurb">Compose plots into arbitrary layouts with <code>|</code>, <code>/</code> and insets. Alignment that actually respects the gtable.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>29</b> symbols</span>
<span class="lib__meta lib__meta--v">v1.3.2.9000.post1</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/patchwork-python" target="_blank" rel="noopener" aria-label="patchwork-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/patchwork-python/" target="_blank" rel="noopener" aria-label="patchwork-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install patchwork-python" title="pip install patchwork-python">
<span>pip install patchwork-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="ext">
<header class="lib__top">
<span class="lib__badge lib__badge--ext">Extension</span>
<span class="lib__tier">tier 3</span>
</header>
<h3 class="lib__name">complexheatmap-python</h3>
<p class="lib__from">ports R <code>ComplexHeatmap</code> · imports as <code>complexheatmap</code></p>
<p class="lib__blurb">Annotated heatmaps, splits and heatmap lists — the de-facto standard for genomics figures.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>103</b> symbols</span>
<span class="lib__meta lib__meta--v">v2.25.3</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/ComplexHeatmap-python" target="_blank" rel="noopener" aria-label="complexheatmap-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/complexheatmap-python/" target="_blank" rel="noopener" aria-label="complexheatmap-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install complexheatmap-python" title="pip install complexheatmap-python">
<span>pip install complexheatmap-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="ext">
<header class="lib__top">
<span class="lib__badge lib__badge--ext">Extension</span>
<span class="lib__tier">tier 2</span>
</header>
<h3 class="lib__name">pheatmap-python</h3>
<p class="lib__from">ports R <code>pheatmap</code> · imports as <code>pheatmap</code></p>
<p class="lib__blurb">Pretty heatmaps with row/column clustering and annotation bars, built on the original grid model.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>29</b> symbols</span>
<span class="lib__meta lib__meta--v">v1.0.13.post1</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/pheatmap-python" target="_blank" rel="noopener" aria-label="pheatmap-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/pheatmap-python/" target="_blank" rel="noopener" aria-label="pheatmap-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install pheatmap-python" title="pip install pheatmap-python">
<span>pip install pheatmap-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="ext">
<header class="lib__top">
<span class="lib__badge lib__badge--ext">Extension</span>
<span class="lib__tier">tier 3</span>
</header>
<h3 class="lib__name">ggrepel-python</h3>
<p class="lib__from">ports R <code>ggrepel</code> · imports as <code>ggrepel_py</code></p>
<p class="lib__blurb">Text and label geoms that repel each other and the plot edges. The reason gene labels are readable.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>11</b> symbols</span>
<span class="lib__meta lib__meta--v">v0.9.8.9999</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/ggrepel-python" target="_blank" rel="noopener" aria-label="ggrepel-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/ggrepel-python/" target="_blank" rel="noopener" aria-label="ggrepel-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install ggrepel-python" title="pip install ggrepel-python">
<span>pip install ggrepel-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="ext">
<header class="lib__top">
<span class="lib__badge lib__badge--ext">Extension</span>
<span class="lib__tier">tier 2</span>
</header>
<h3 class="lib__name">ggalluvial-python</h3>
<p class="lib__from">ports R <code>ggalluvial</code> · imports as <code>ggalluvial</code></p>
<p class="lib__blurb">Alluvial diagrams and flow plots for categorical longitudinal data — clone tracking, fate mapping, cohort flows.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>38</b> symbols</span>
<span class="lib__meta lib__meta--v">v0.12.6</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/ggalluvial-python" target="_blank" rel="noopener" aria-label="ggalluvial-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/ggalluvial-python/" target="_blank" rel="noopener" aria-label="ggalluvial-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install ggalluvial-python" title="pip install ggalluvial-python">
<span>pip install ggalluvial-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="ext">
<header class="lib__top">
<span class="lib__badge lib__badge--ext">Extension</span>
<span class="lib__tier">tier 2</span>
</header>
<h3 class="lib__name">ggh4x-python</h3>
<p class="lib__from">ports R <code>ggh4x</code> · imports as <code>ggh4x</code></p>
<p class="lib__blurb">Hooks into facets, axes and strips that the grammar does not expose on its own.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>78</b> symbols</span>
<span class="lib__meta lib__meta--v">v0.3.1.9000</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/ggh4x-python" target="_blank" rel="noopener" aria-label="ggh4x-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/ggh4x-python/" target="_blank" rel="noopener" aria-label="ggh4x-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install ggh4x-python" title="pip install ggh4x-python">
<span>pip install ggh4x-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="ext">
<header class="lib__top">
<span class="lib__badge lib__badge--ext">Extension</span>
<span class="lib__tier">tier 2</span>
</header>
<h3 class="lib__name">ggnewscale-python</h3>
<p class="lib__from">ports R <code>ggnewscale</code> · imports as <code>ggnewscale</code></p>
<p class="lib__blurb">Multiple independent colour and fill scales in a single plot, without fighting the guide system.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>11</b> symbols</span>
<span class="lib__meta lib__meta--v">v0.5.2.9000</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/ggnewscale-python" target="_blank" rel="noopener" aria-label="ggnewscale-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/ggnewscale-python/" target="_blank" rel="noopener" aria-label="ggnewscale-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install ggnewscale-python" title="pip install ggnewscale-python">
<span>pip install ggnewscale-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="analysis">
<header class="lib__top">
<span class="lib__badge lib__badge--analysis">Analysis</span>
<span class="lib__tier">tier 2</span>
</header>
<h3 class="lib__name">monocle2-python</h3>
<p class="lib__from">ports R <code>monocle 2.9.0</code> · imports as <code>monocle2py</code></p>
<p class="lib__blurb">Single-cell trajectory inference — DDRTree, BEAM, pseudotime — with its entire visualization layer on the Bio-Babel stack. No matplotlib, no seaborn.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>44</b> symbols</span>
<span class="lib__meta lib__meta--v">v2.9.0</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/Monocle2-python" target="_blank" rel="noopener" aria-label="monocle2-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/monocle2-python/" target="_blank" rel="noopener" aria-label="monocle2-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install monocle2-python" title="pip install monocle2-python">
<span>pip install monocle2-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="analysis">
<header class="lib__top">
<span class="lib__badge lib__badge--analysis">Analysis</span>
<span class="lib__tier">tier 2</span>
</header>
<h3 class="lib__name">monocle3-python</h3>
<p class="lib__from">ports R <code>monocle3</code> · imports as <code>monocle3</code></p>
<p class="lib__blurb">AnnData-native trajectories, clustering and differential expression.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>42</b> symbols</span>
<span class="lib__meta lib__meta--v">v1.4.26.post1</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/Monocle3-python" target="_blank" rel="noopener" aria-label="monocle3-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/monocle3-python/" target="_blank" rel="noopener" aria-label="monocle3-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install monocle3-python" title="pip install monocle3-python">
<span>pip install monocle3-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="analysis">
<header class="lib__top">
<span class="lib__badge lib__badge--analysis">Analysis</span>
<span class="lib__tier">tier 3</span>
</header>
<h3 class="lib__name">nichenet-python</h3>
<p class="lib__from">ports R <code>nichenetr</code> · imports as <code>nichenetr</code></p>
<p class="lib__blurb">Ligand → target modelling of intercellular communication, with the prior networks intact.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>56</b> symbols</span>
<span class="lib__meta lib__meta--v">v2.2.1.1</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/Nichenet-python" target="_blank" rel="noopener" aria-label="nichenet-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/nichenet-python/" target="_blank" rel="noopener" aria-label="nichenet-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install nichenet-python" title="pip install nichenet-python">
<span>pip install nichenet-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="analysis">
<header class="lib__top">
<span class="lib__badge lib__badge--analysis">Analysis</span>
<span class="lib__tier">tier 2</span>
</header>
<h3 class="lib__name">tradeSeq-python</h3>
<p class="lib__from">ports R <code>tradeSeq</code> · imports as <code>tradeseq</code></p>
<p class="lib__blurb">NB-GAM trajectory-based differential expression along lineages.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>9</b> symbols</span>
<span class="lib__meta lib__meta--v">v1.13.12</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/tradeSeq-python" target="_blank" rel="noopener" aria-label="tradeSeq-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/tradeSeq-python/" target="_blank" rel="noopener" aria-label="tradeSeq-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install tradeSeq-python" title="pip install tradeSeq-python">
<span>pip install tradeSeq-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="analysis">
<header class="lib__top">
<span class="lib__badge lib__badge--analysis">Analysis</span>
<span class="lib__tier">tier 3</span>
</header>
<h3 class="lib__name">copykat-python</h3>
<p class="lib__from">ports R <code>copykat</code> · imports as <code>copykat</code></p>
<p class="lib__blurb">CNV-based aneuploidy detection from scRNA-seq — separating tumour from stroma.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>17</b> symbols</span>
<span class="lib__meta lib__meta--v">v1.1.0.post1</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/copykat-python" target="_blank" rel="noopener" aria-label="copykat-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/copykat-python/" target="_blank" rel="noopener" aria-label="copykat-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install copykat-python" title="pip install copykat-python">
<span>pip install copykat-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
<article class="lib" data-group="analysis">
<header class="lib__top">
<span class="lib__badge lib__badge--analysis">Analysis</span>
<span class="lib__tier">tier 3</span>
</header>
<h3 class="lib__name">ddrtree-python</h3>
<p class="lib__from">ports R <code>DDRTree</code> · imports as <code>ddrtree</code></p>
<p class="lib__blurb">Reversed graph embedding for principal-graph learning. The engine underneath Monocle 2.</p>
<footer class="lib__bot">
<span class="lib__meta"><b>5</b> symbols</span>
<span class="lib__meta lib__meta--v">v0.1.6</span>
<span class="lib__links">
<a href="https://github.com/Bio-Babel/DDRTree-python" target="_blank" rel="noopener" aria-label="ddrtree-python on GitHub" title="GitHub">
<svg viewBox="0 0 16 16" width="15" height="15" fill="currentColor"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z"/></svg>
</a>
<a href="https://pypi.org/project/ddrtree-python/" target="_blank" rel="noopener" aria-label="ddrtree-python on PyPI" title="PyPI">
<svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"><path d="M12 2.6 20.5 7v10L12 21.4 3.5 17V7L12 2.6Z"/><path d="M3.7 7.1 12 11.6l8.3-4.5M12 11.6V21"/></svg>
</a>
</span>
</footer>
<button class="lib__copy" data-copy="pip install ddrtree-python" title="pip install ddrtree-python">
<span>pip install ddrtree-python</span>
<svg viewBox="0 0 16 16" width="13" height="13" fill="none" stroke="currentColor" stroke-width="1.4"><rect x="5.2" y="5.2" width="8.3" height="8.3" rx="1.6"/><path d="M10.8 3.2A1.7 1.7 0 0 0 9.1 2H4.2A2.2 2.2 0 0 0 2 4.2v4.9c0 .8.5 1.4 1.2 1.7"/></svg>
</button>
</article>
</div>
<p class="libs__note">
Every library in the catalog is <strong>under active testing</strong> — APIs stabilizing,
edges still being filed. Use it for verifiable work, and tell us when it is wrong.
</p>
</div>
</section>
<!-- ══════════════════════════════════════════════════════════ TOOLING ═══ -->
<section class="section section--alt" id="tooling">
<div class="wrap">
<p class="eyebrow">The framework</p>
<h2 class="h2">A build side, a read side, and the contract between them.</h2>
<p class="lede">
Fidelity and usability are met by two agent-driven systems, coupled by the contract that each
package carries: a <strong>build side</strong> that reconstructs the software, and a
<strong>read side</strong> that serves its operating knowledge to the agent. Two of the three
are not public yet.
</p>
<div class="sys">
<article class="sys__card">
<header class="sys__top">
<span class="sys__role sys__role--build">Build side</span>
<span class="sys__n">01</span>
</header>
<h3 class="sys__name">bio-babel-toolkit</h3>
<p>
Drives coding agents through the 13-step workflow that reconstructs a package natively.
A controller keeps state in a report tree on disk rather than in the model's context, so
progress survives an agent losing it — and implementation is ordered by a dependency-graph
partition, package-wide, instead of proceeding function by function.
</p>
<span class="sys__cta sys__cta--soon">Coming soon</span>
</article>
<article class="sys__card">
<header class="sys__top">
<span class="sys__role sys__role--build">The contract</span>
<span class="sys__n">02</span>
</header>
<h3 class="sys__name">bio-babel-annotator</h3>
<p>
Writes each package's <code>_biobabel/</code> contract from that package's own source, in
an isolated session that can never read a neighbour's. Seven deterministic checks gate the
result, so coverage of the public surface cannot silently shrink and no detector ships
without firing on its own bad example.
</p>
<span class="sys__cta sys__cta--soon">Coming soon</span>
</article>
<article class="sys__card">
<header class="sys__top">
<span class="sys__role sys__role--read">Read side</span>
<span class="sys__n">03</span>
</header>
<h3 class="sys__name">bio-babel-MCP</h3>
<p>
Assembles those contracts from every installed package through one Python entry-point
group and serves them as 12 read-only tools over MCP. There is no central registry, and
the server neither plans nor executes: an agent sees exactly what the user installed, and
a package without a contract is invisible.
</p>
<a class="sys__cta" href="https://github.com/Bio-Babel/bio-babel-MCP" target="_blank" rel="noopener">Open source ↗</a>
</article>
</div>
<div class="split">
<div class="split__code">
<div class="code">
<div class="code__bar">
<span class="code__dots"><i></i><i></i><i></i></span>
<span class="code__name">grid_py/_biobabel/</span>
</div>
<pre class="code__body"><code><span class="t-d">├──</span> <span class="t-f">__init__.py</span> <span class="t-c"># get_manifest() → PackageManifest</span>
<span class="t-d">├──</span> <span class="t-f">package.yaml</span> <span class="t-c"># identity · tier · class · foundation</span>
<span class="t-d">├──</span> <span class="t-f">skill.md</span> <span class="t-c"># the narrative, for the LLM</span>
<span class="t-d">├──</span> <span class="t-f">symbols/</span>*.yaml <span class="t-c"># 261 signatures + requires/writes/mutates</span>
<span class="t-d">├──</span> <span class="t-f">concepts/</span>*.yaml <span class="t-c"># 6 invariants, "for R users / for Python users"</span>
<span class="t-d">├──</span> <span class="t-f">idioms/</span>*.yaml <span class="t-c"># 15 verbatim runnable templates</span>
<span class="t-d">├──</span> <span class="t-f">anti_patterns/</span>* <span class="t-c"># 4 detectable mistakes + the correct form</span>
<span class="t-d">├──</span> <span class="t-f">templates/</span>*.py <span class="t-c"># real code that actually runs</span>
<span class="t-d">└──</span> <span class="t-f">detectors.py</span> <span class="t-c"># the AST checks, owned by the package</span>
</code></pre>
</div>
<div class="code code--term">
<div class="code__bar">
<span class="code__dots"><i></i><i></i><i></i></span>
<span class="code__name">agent session</span>
</div>
<pre class="code__body"><code><span class="t-c"># the agent guesses — R muscle memory</span>
<span class="t-k">grid</span>.viewport(width=<span class="t-fn">unit</span>(<span class="t-n">0.5</span>, <span class="t-s">"npc"</span>)) <span class="t-bad">✗ silently wrong</span>
<span class="t-c"># the agent asks first</span>
<span class="t-fn">biobabel.describe_symbol</span>(pkg=<span class="t-s">"grid_py"</span>,
symbol=<span class="t-s">"Unit"</span>)
<span class="t-c">→ Unit(value, units) — class, not a function.</span>
<span class="t-c">→ anti-pattern: unit_kw — lowercase unit() is R.</span>
<span class="t-k">grid_py</span>.Viewport(width=<span class="t-fn">Unit</span>(<span class="t-n">0.5</span>, <span class="t-s">"npc"</span>)) <span class="t-ok">✓</span>
</code></pre>
</div>
</div>
<div class="split__text">
<h3 class="h3">12 read-only tools</h3>
<p class="muted">
All prefixed <code>biobabel.</code>, all returning the same envelope, all served over
line-delimited JSON-RPC on stdio. The server holds no business logic and
<strong>never executes your code</strong>.
</p>
<div class="tools">
<div class="tools__group">
<p class="tools__head"><span class="dot dot--violet"></span>Discovery <b>8</b></p>
<ul>
<li><code>list_packages</code></li><li><code>describe_package</code></li>
<li><code>list_workflows</code></li><li><code>describe_workflow</code></li>
<li><code>list_symbols</code></li><li><code>describe_symbol</code></li>
<li><code>list_templates</code></li><li><code>describe_template</code></li>
</ul>
</div>
<div class="tools__group">
<p class="tools__head"><span class="dot dot--gold"></span>Concept <b>3</b></p>
<ul>
<li><code>describe_concept</code></li><li><code>list_idioms</code></li>
<li><code>describe_idiom</code></li>
</ul>
</div>
<div class="tools__group">
<p class="tools__head"><span class="dot dot--cyan"></span>Validation <b>1</b></p>
<ul>
<li><code>check_code</code> <span class="muted">— static AST scan</span></li>
</ul>
</div>
</div>
<h3 class="h3">Hard invariants</h3>
<ul class="checks">
<li><b>Contract is mandatory.</b> No <code>_biobabel/</code>, no registration. There is no
reflection fallback and no degraded mode.</li>
<li><b>Entry points only.</b> The registry never scans <code>site-packages</code>. The
producer declares itself.</li>
<li><b>Never executes code.</b> No <code>exec</code>, no subprocess, no eval. Running a
snippet is the calling agent's job.</li>
<li><b>No silent degradation.</b> Broken entry points, duplicate ids and unregistered
detectors surface as explicit errors.</li>
<li><b>Domain knowledge stays with its owner.</b> Core ships zero detectors; the package
that owns the domain owns its AST checks.</li>
</ul>
<div class="split__cta">
<a class="btn btn--outline" href="https://github.com/Bio-Babel/bio-babel-MCP" target="_blank" rel="noopener">bio-babel-MCP on GitHub ↗</a>
<button class="copychip copychip--sm" data-copy="biobabel install --target claude_code">
<span class="copychip__prompt">$</span>
<code>biobabel install --target claude_code</code>
<span class="copychip__ok">copied</span>
</button>
</div>
</div>
</div> </div>
</section>
<!-- ═══════════════════════════════════════════════════════ PRINCIPLES ═══ -->
<section class="section" id="principles">
<div class="wrap">
<p class="eyebrow">Principles</p>
<div class="cards cards--4">
<article class="card card--num"><span class="card__num">01</span>
<h3>Semantic parity, idiomatic surface</h3>
<p>Behaviour trusts the reference; the API feels native to the target language. Not a
line-for-line transliteration — a sibling.</p>
</article>
<article class="card card--num"><span class="card__num">02</span>
<h3>No runtime bridges</h3>
<p>No <code>rpy2</code>, no second interpreter, no R install. If you can
<code>pip install</code> it, it works.</p>
</article>
<article class="card card--num"><span class="card__num">03</span>
<h3>Validated against the origin</h3>
<p>Every public function is checked against its reference — numerically where possible,
visually where not. Divergence is a bug, not a feature.</p>
</article>
<article class="card card--num"><span class="card__num">04</span>
<h3>Docs and stewardship, first-class</h3>
<p>A port is alive when someone is learning it and someone is maintaining it. Every package
has a caretaker, not just an author.</p>
</article>
</div> </div>
</section>
<!-- ═════════════════════════════════════════════════════════════ JOIN ═══ -->
<section class="section section--alt" id="join">
<div class="wrap">
<p class="eyebrow">Community</p>
<h2 class="h2">Three ways in, in rough order of commitment.</h2>
<ol class="join">
<li class="join__row">
<span class="join__k">01</span>
<div><h3>Tell us what is missing, or what is wrong</h3>
<p>Name a classic you wish existed on the other side, and the workflow that is painful
without it. Better still, report a port behaving differently from its reference — that one
belongs on the port's own repository. Divergence is a bug, and it is the most useful thing
you can send us.</p></div>
<a class="join__go" href="https://github.com/Bio-Babel/.github/issues" target="_blank" rel="noopener">Open an issue ↗</a>
</li>
<li class="join__row">
<span class="join__k">02</span>
<div><h3>Bring one over</h3>
<p>Tell us which classic you would like to help carry across and we will help you scope
it — or simply start, in public. Rough drafts are welcome: the pipeline assists the draft,
and what needs more hands is the review and the stewardship that follow it.</p></div>
<a class="join__go" href="https://github.com/Bio-Babel/.github/issues" target="_blank" rel="noopener">Say hello ↗</a>
</li>
<li class="join__row join__row--hi">
<span class="join__k">03</span>
<div><h3>Adopt a package</h3>
<p>The scarcest resource here is not code, it is long-term maintainers. Every library is
its own repository with its own caretaker; if one of them matters to your work, consider
becoming that caretaker.</p></div>
<a class="join__go" href="https://github.com/Bio-Babel/.github/issues" target="_blank" rel="noopener">Volunteer ↗</a>
</li>
</ol>
</div>
</section>
<!-- ═══════════════════════════════════════════════════════════ CLOSER ═══ -->
<section class="closer">
<div class="closer__bg" aria-hidden="true"><div class="hero__grid"></div></div>
<div class="wrap closer__inner">
<img class="closer__mark" src="assets/img/logo-mark.svg" alt="" width="78" height="78">
<h2>The classics, kept alive<br>in more than one tongue.</h2>
<div class="hero__cta">