Life sciences components for Bubble Tea.
Sequences, molecules, plates, ontologies, elements, and variants — rendered natively in the terminal.
SequenceViewer — property-aware DNA/RNA/protein inspection with view cycling, complement strands, and residue-level analysis.
Crust is a standalone Go component library for structured biological inspection in the terminal. Each component is a normal Bubble Tea v2 model with typed constructors and functional options — drop any of them into your own TUI application.
import "github.com/the-omics-os/crust/sequenceviewer"
viewer := sequenceviewer.New(
sequenceviewer.WithSequence("ATGGCTAGCTAGCTAGCTAGC", sequenceviewer.DNA),
sequenceviewer.WithWidth(80),
sequenceviewer.WithComplement(true),
)No JSON protocols. No framework lock-in. Just tea.Model implementations you can embed, compose, and theme.
| Component | Package | What it does |
|---|---|---|
| SequenceViewer | sequenceviewer |
DNA/RNA/protein display with IUPAC coloring, Clustal amino acid schemes, GC analysis, ORF detection, restriction sites, Tm estimation, and view-switchable property overlays |
| MoleculeViewer | moleculeviewer |
2D molecular structure from SMILES with Unicode bond rendering, atom navigation, functional-group highlighting, and a focused inspector pane |
| PlateMap | platemap |
96/384/1536-well assay plates with signal, z-score, and control views, hit calling, row/column sweeps, and replicate awareness |
| OntologyBrowser | ontologybrowser |
Tree navigation for GO, Reactome, ChEBI, and Disease Ontology with lazy-load children, fuzzy search, and node selection |
| PeriodicTable | periodictable |
Full 118-element interactive table with category coloring, property views, and a detail panel |
| VariantLens | variantlens |
Multi-layer variant consequence inspector — nucleotide, codon, amino acid, and feature context aligned in one view |
| QCDashboard | qcdashboard |
Multi-metric quality panel with pass/warn/fail status bars and configurable thresholds |
| ThresholdSlider | thresholdslider |
Numeric threshold adjustment with visual bar and live item count feedback |
go get github.com/the-omics-os/crust@latestImport only what you need:
import (
"github.com/the-omics-os/crust/sequenceviewer"
"github.com/the-omics-os/crust/periodictable"
"github.com/the-omics-os/crust/platemap"
)Requirements: Go 1.25+, Charm v2 (charm.land/bubbletea/v2, charm.land/lipgloss/v2)
Every component follows the same pattern — functional options, standard tea.Model interface, dynamic theming:
package main
import (
"fmt"
"os"
tea "charm.land/bubbletea/v2"
"github.com/the-omics-os/crust/periodictable"
)
func main() {
m := periodictable.New(
periodictable.WithWidth(100),
)
p := tea.NewProgram(m)
if _, err := p.Run(); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
}Run the built-in demos
go run ./sequenceviewer/cmd/demo/
go run ./moleculeviewer/cmd/demo/
go run ./periodictable/cmd/demo/
go run ./platemap/cmd/demo/
go run ./ontologybrowser/cmd/demo/
go run ./variantlens/cmd/demo/- Standalone
tea.Model— every component is a normal Bubble Tea v2 model. Typed constructors, functional options. No protocol coupling. - Build on Bubbles, don't replace them — viewport for scrolling, textinput for search, key for bindings. Never reimplement solved problems.
- Domain-correct — IUPAC nucleotide colors, Clustal amino acid schemes, standard periodic table categories. Scientific conventions over aesthetics.
- Composable — each component is independently importable. No god package. Pick what you need.
- Dynamic theming — per-component
Themestruct withDefaultTheme()andWithTheme(). No hardcoded colors. - Compute-capable — components carry rich data, not just characters. Residues have chemophysical properties. Analysis runs natively in Go.
All components share a consistent keyboard vocabulary:
| Key | Action |
|---|---|
| Arrow keys | Navigate within the current view |
Tab |
Cycle view modes / switch panes |
Enter |
Confirm / select / expand |
Esc |
Exit / dismiss / cancel |
? |
Toggle help overlay |
Crust is a library. It has no opinions about your application architecture.
your-app/
main.go # Your Bubble Tea program
├── uses crust/sequenceviewer
├── uses crust/platemap
└── uses crust/periodictable
crust/ # This repo — standalone components
sequenceviewer/ # tea.Model + typed constructors
moleculeviewer/ # tea.Model + SMILES parser + 2D layout
platemap/ # tea.Model + well grid navigation
ontologybrowser/ # tea.Model + lazy-load tree
periodictable/ # tea.Model + 118 elements
variantlens/ # tea.Model + multi-layer variant inspector
qcdashboard/ # tea.Model + metric status bars
thresholdslider/ # tea.Model + numeric adjustment
Components signal completion via typed messages (SubmitMsg, CancelMsg) and accept live data updates through Set*() mutators — making them ready for streaming workflows without requiring any protocol layer.
Crust is the terminal UI layer for the Omics-OS ecosystem. Lobster AI is the first consumer — its biocomp/ adapter layer wraps Crust components into the agent protocol for interactive multi-omics analysis sessions.
Lobster AI (multi-agent system)
└── lobster-tui/internal/biocomp/ # Adapter layer
└── wraps Crust components # JSON → typed constructor → tea.Model
└── crust/* # This library
You don't need Lobster to use Crust. Any Bubble Tea application can embed these components directly.
go mod tidy # Sync dependencies
go build ./... # Compile all packages
go test ./... # Run all tests
go vet ./... # Static analysis|
|
Crust exists because of the extraordinary work by Charm. Bubble Tea, Lip Gloss, Bubbles, and the entire Charm v2 stack make terminal UIs a joy to build. Thank you to @meowgorithm, @muesli, @caarlos0, @aymanbagabas, @bashbunni, and every Charm contributor. You changed what terminals can be. |



