ATCGATCG
GCTAGCTA
|> filter |> map
v1.5.0 — Now Available

A domain-specific
language for
bioinformatics

A DSL purpose-built for genomics and bioinformatics — native DNA/RNA/protein types, 1000+ built-in functions, streaming I/O, 21 bio API clients, and Rust performance with a clean, pipe-first syntax.

Early Preview: BioLang is a new experimental language under active development. While we strive for stability, you may encounter rough edges. If you find issues, please report them on GitHub — your feedback shapes the language.

Why a domain-specific language?

General-purpose languages like Python and R require stitching together dozens of packages to do bioinformatics. BioLang is a DSL — every design decision, from the type system to the syntax, is made for genomics workflows. Here's what that means in practice:

No import ceremony — DNA types, FASTA readers, GC content, k-mers, interval queries, and 1000+ functions are available immediately. No pip install, no import boilerplate.
Types that match the domain dna"ATCG", Interval, Variant, AlignedRead, Quality are first-class values with built-in methods, not strings pretending to be sequences.
Pipes match how bioinformatics thinks reads |> filter |> map |> summarize. Data flows through a pipeline, just like the biological workflow it models.
Safe by default — no null pointer exceptions, no silent type coercions. Errors point to the genomic operation that failed, not a stack trace in pandas internals.
Fast without C extensions — compiled to native bytecode via Rust. No NumPy wheel issues, no Cython compilation step. Single binary, runs everywhere.
Streaming by design — process 100 GB FASTQ files in constant memory. Lazy evaluation is the default, not an afterthought bolted onto eager collections.

BioLang is not a general-purpose language, and that's the point. It does one thing — bioinformatics scripting — and does it well.

Who is BioLang for?

🧬
Biologists

Analyze sequences, variants, and expression data without learning a programming language first.

🎓
Students

The fastest on-ramp to bioinformatics. Write your first analysis in minutes, not days of environment setup.

Researchers

Quick one-off analyses without spinning up a Jupyter notebook. One command, instant results.

🔬
Anyone tired of setup

No conda environments, no dependency conflicts, no wheel compilation failures. Single binary, works everywhere.

BioLang isn't here to replace your existing tools — it's the fastest path from raw data to first result. Start here, then grow into Python or R when your analysis demands it.

What's included

Everything you need from read to result — batteries included.

Pipe-First Syntax

Chain operations naturally with |>. No nested function calls, no temp variables. Data flows left to right.

Bio-Native Types

First-class dna"...", rna"...", protein"..." literals with built-in methods for complement, translate, GC content.

1000+ Builtins

Statistics, tables, matrices, file I/O (FASTA/FASTQ/VCF/BAM/BED/GFF), plotting, k-mers, alignment, motifs — all built in.

Streaming I/O

Process multi-GB FASTQ/BAM files without loading into memory. Lazy streams + pipes = constant memory usage.

21 API Clients

NCBI, Ensembl, UniProt, UCSC, KEGG, STRING, PDB, Reactome, GO, COSMIC, BioMart, nf-core, BioContainers, Galaxy ToolShed, NCBI Datasets — query any database in one line.

Rust Performance

Native Rust I/O via noodles, and sequence work that runs in compiled code rather than a loop: 16x faster than BioPython on translation, 3.6x on GC content. It loses elsewhere — k-mer counting is 3.9x slower than a Python dict, and anything written as an interpreted loop is slower still. See benchmarks →

278 Rosalind problems, 276 answers checked in CI

Rosalind is the bioinformatics problem set used in teaching worldwide. These problems are not mine to choose, and the answers are not mine to mark: each solution is asserted against the official answer, and every one is re-run on each commit — natively, and again through the same WebAssembly build this site serves.

All four tracks are complete — every problem in each, asserted against its published answer.

Open one and press Run

Solutions are MIT. Problem statements belong to rosalind.info — each example paraphrases Given/Return in a line or two and links to the original rather than reproducing it.

The same answers as BioPython and Bioconductor

Rosalind answers “does this match a published answer”. This answers the other half: does it agree with the tools people already use. Each task is written three times — once in BioLang, once in Python with BioPython, once in R with Bioconductor — and a comparator checks the values they produce: floats to 1e-6, integers and strings exactly.

Every run records the tool versions, the data source, the tolerance, and a SHA-256 over each side’s output, so “identical” is something you can check rather than something we assert.

Compare BioLang, Python and R →

Agreement is strong evidence, not proof: it adopts BioPython’s and Bioconductor’s conventions as the reference, and a shared misreading of a file format would be invisible to it. Where the languages genuinely disagree — BioLang rounds halves away from zero, Python and R round to even — that is recorded rather than hidden.

Try it in your browser

BioLang runs right here via WebAssembly. Click Run on any example below — no install needed.

First click downloads the runtime (~4 MB), then it's cached for the session. Every code block across the docs is interactive too.

DNA Operations

let seq = dna"ATCGATCGATCG"
println(f"GC content: {gc_content(seq)}")
println(f"Complement: {complement(seq)}")
println(f"Rev-comp:   {reverse_complement(seq)}")
println(f"Transcribe: {transcribe(seq)}")
println(f"Length:     {seq_len(seq)} bp")

Translation & K-mers

let coding = dna"ATGAAAGCTTTTGACTGA"
let prot = translate(coding)
println(f"Protein: {prot}")

let seq = dna"ATCGATCGATCG"
let kmer_list = kmers(seq, 4)
println(f"4-mers: {kmer_list}")

Statistics

let normal = [5.2, 4.8, 5.1, 4.9, 5.3]
let tumor = [8.1, 7.9, 8.5, 7.6, 8.3]
let result = ttest(normal, tumor)
println(f"t = {round(result.statistic, 3)}")
println(f"p = {result.p_value}")
println(f"Significant: {result.p_value < 0.05}")

Pipes & Lambdas

# Pipe-first: data flows left to right
let genes = ["BRCA1", "TP53", "EGFR", "KRAS"]
genes
  |> filter(|g| len(g) <= 4)
  |> map(|g| f"{g} ({len(g)} chars)")
  |> each(|g| println(g))

BioLang vs Python

Same task, less code, more clarity.

Python + BioPython + pandas 14 lines
from Bio import SeqIO
import pandas as pd

records = []
for rec in SeqIO.parse("reads.fq", "fastq"):
    quals = rec.letter_annotations[
        "phred_quality"
    ]
    if sum(quals)/len(quals) >= 30:
        gc = (rec.seq.count("G")
              + rec.seq.count("C")) \
              / len(rec.seq)
        records.append({"id": rec.id,
                        "gc": gc})
df = pd.DataFrame(records)
print(df.describe())
BioLang 5 lines
read_fastq("data/reads.fastq")
  |> filter(|r| mean_phred(r.quality) >= 30)
  |> each(|r| println(f"{r.id}: len={r.length}"))

Benchmarked against BioPython & Bioconductor

32 bioinformatics tasks on real-world data (NCBI, UniProt, ClinVar, ENCODE).

These are whole-script times: interpreter startup and library imports included, which is what a one-off analysis actually costs — import Bio alone takes 400 ms or more. That framing flatters BioLang on small inputs, so read the large ones. Parsing a 30 kB FASTA comes out 76× faster, which is mostly startup; counting k-mers across 51 MB of chr22 comes out 2.8×, and that is the figure that reflects the work rather than the launch. Re-measured on bl 1.1.0 in August 2026 — the previous set was bl 0.2.1 from March, and understated current performance.

17.0x
ENCODE Overlap
14.0x
Protein K-mers
5.8x
GC Content (51 MB)
3.3x
K-mer Counting
Task BioLang Python R Speedup
ENCODE Peak Overlap0.154s2.614s17.0x
Protein K-mers0.011s0.154s1.071s14.0x
FASTA Parse (30 KB)0.002s0.153s1.040s76.5x
E. coli Genome0.010s0.164s1.079s16.4x
GC Content (51 MB)0.125s0.721s1.409s5.8x
K-mer Counting (21-mers)9.960s28.262s2.8x

Linux (WSL2) — Intel i9-12900K, 16 GB RAM. Python wins on VCF/CSV text parsing where C extensions dominate. K-mer counting uses canonical (strand-agnostic) 21-mers — BioLang does strictly more work.

Take the startup out and the picture changes, so here it is too. Timed per operation on a 1 Mb genome, every implementation checked to return the same answer before any timing is believed. BioLang wins where a Rust builtin does the work — translation 16× faster than BioPython, GC content 3.6×, Viterbi decoding 4.7× faster than pure Python. It loses wherever the work happens in interpreted BioLang: k-mer counting 3.9× slower than a Python dict, FASTA parsing 3.3× slower, a plain loop 9× slower than CPython. Against C it still loses, by less than it did — edit distance runs Myers’ bit-parallel algorithm now, the same one edlib uses, which took it from 4.0× slower to 1.9×. Suffix arrays are still 6.8× behind pydivsufsort, because they use prefix doubling where it uses SA-IS. The harness is bench/harness.py, and bench/Dockerfile pins all three toolchains so you can reproduce it.

1000+
Built-in Functions
21
Bio API Clients
15
File Formats
42
Plot Types
Rust
Pure Performance
Browser Tools — Installable PWAs

Everything runs in your browser

No installation, no server, no uploads. BioLang compiles to WebAssembly so you can analyze bioinformatics data entirely client-side. All tools work offline as installable PWAs.

Playground

Run code instantly

Write and execute BioLang code blocks with persistent state, inline SVG charts, and syntax highlighting. Great for experimenting and learning.

{ }

Notebook

Edit and run .bln files

Open local or public notebooks, edit Markdown and code cells, attach data, and render tables and plots. Later cells automatically run required earlier code.

🔍

Viewer

Inspect bio files

Drop FASTA, FASTQ, VCF, BED, GFF, CSV files for instant parsing, statistics (N50, GC%, Q30, Ti/Tv), sortable tables, column filters, multi-format export, URL loading, and BioLang analysis. Data never leaves your machine.

🔎

BioGist

Gene intelligence sidebar

Auto-detects genes, variants, accessions, and species on any webpage. Click any entity for instant details from NCBI, UniProt, gnomAD, and ClinVar. Chrome sidebar extension + PWA.

🔬

BioKhoj

Research radar

Personal literature monitor. Watch genes, drugs, and variants across PubMed and bioRxiv. Signal scoring ranks papers by relevance. Background checks, co-mention detection, and weekly digest. Chrome sidebar extension + PWA.

Free BioLang books

A complete reference for the language, free to read online.

A workbench, not just a playground

Editor, file tree, console, and plots — the same interpreter as the CLI, compiled to WebAssembly. Open it in a browser with nothing installed, or run the desktop build when you need the things a browser cannot do.

In the browser

Nothing to install

Write and run BioLang in a tab. Every example pack installs into the workspace on a single link, with the sample data the documentation reads. Work is kept locally between visits.

On the desktop

Real files, real tools

The same workbench as a native app: your own filesystem, the bl CLI, remote execution over SSH, and the APIs a browser cannot reach because they send no CORS headers.

Open the workbench

Get started in seconds

Single binary, no runtime dependencies.

$ curl -fsSL https://lang.bio/install.sh | sh
$ bl repl
BioLang v1.5.0 REPL — type :help for commands
bl> dna"ATCG" |> gc_content()
0.5