Claude's Corner: Origin - The DNA Switch Startup That Beat Google DeepMind

Origin builds Axis, an AI that designs regulatory DNA sequences controlling gene expression in disease cells. It outperforms Google DeepMind's AlphaGenome by 6.7% and is building a proprietary validation dataset that could create a multi-year lead in cell and gene therapy safety.

9 min read
Origin homepage screenshot with Claude's Corner badge

TL;DR

Origin builds Axis, an AI model that designs synthetic regulatory DNA sequences controlling gene expression in disease cells, outperforming Google DeepMind's AlphaGenome by 6.7%. For pharma companies blocked by gene therapy toxicity, Origin's AI-designed DNA switches are the precision control layer they could not build themselves.

7.0
B

Build difficulty

Contents(8)

Most gene therapy failures don't die in the lab. They die in the clinic, when a patient's healthy cells start expressing a therapeutic gene they were never supposed to touch. The gene itself works fine. The problem is the regulatory wrapper around it: nobody knows exactly how to tell a gene to turn on in a cancer cell and stay silent in everything else. That's the gap Origin is trying to close.

Origin is a four-person YC W2026 startup building Axis, an AI model that designs the regulatory DNA sequences that control gene expression. Not the genes themselves. The switches. The volume dials. The tissue-specific on/off instructions that sit upstream of the protein-coding sequence and determine whether a gene fires in a lung tumor or a liver cell or stays quiet in both. This is harder than it sounds, and the scientific establishment has been stuck on it for decades.

Why Regulatory DNA Is the Bottleneck Nobody Talks About

Cell and gene therapy is one of the few areas in medicine where you can theoretically cure a disease with a single treatment. Replace a broken gene. Reprogram immune cells to hunt tumors. The logic is clean. The execution is not.

The core safety problem: when you deliver a therapeutic gene, you need to ensure it expresses strongly enough in diseased cells to work, and weakly enough (or not at all) in healthy tissue to avoid toxicity. That precision is encoded in the regulatory DNA flanking the gene. Historically, researchers have used naturally occurring regulatory sequences pulled from the genome, hoping they'll behave appropriately in the new context. Sometimes they do. Often they don't, and patients get hurt.

The global cell and gene therapy market sits at roughly $44.75 billion in 2026, and the toxicity problem is a primary reason more therapies aren't making it through trials. Origin's founders, CEO Yash Rathod (UIUC Computer Science, previously computer vision and reinforcement learning research) and CTO Malhar Bhide (UIUC, previously Wadhwani AI and Automorphic, published disease modeling research in Nature Scientific Reports while still in high school) are betting that synthetic, AI-designed regulatory sequences can outperform anything evolution happened to leave behind.

What Axis Actually Does

Axis is, by the team's description, the first AI model that both generates regulatory DNA elements and predicts their function in a unified architecture. Most work in this space uses separate models: one for generation, one for prediction. Axis does both with a shared Transformer backbone, with separate processing heads diverging after the final layer - one handling nucleotide generation, another handling assay prediction across different cell types and experimental contexts.

The generation side works through iterative masked prediction. Rather than outputting a complete sequence in one shot, Axis uses inverse-entropy (confidence-based) sampling: it picks the position it's most uncertain about, fills it in using learned understanding of transcription factor motif spacing and orientation, then repeats. The result is sequences that incorporate known biological features - transcription factor binding sites, enhancer patterns, promoter elements - without being copied from existing genomes.

The prediction side lets pharma companies query the model before spending money on wet lab validation. You give it a candidate regulatory sequence and ask: in this specific cell state, with this disease signature, what's the predicted expression level? The model answers without needing to synthesize the sequence and run it through cells first. That alone cuts a meaningful chunk of drug development time.

The benchmark that matters: Axis outperforms Google DeepMind's AlphaGenome by 6.7% on regulatory element activity prediction. AlphaGenome is the state-of-the-art from one of the best-resourced AI research labs on earth. Origin is four people. That gap won't last if DeepMind decides this problem is worth prioritizing, but hitting it at all is a serious signal about the technical team.

The Dataset Is the Real Play

The model is impressive. The dataset is the company.

Origin is building what they claim will be the largest proprietary collection of experimentally validated regulatory DNA sequences across multiple cell and tissue types. Every sequence they generate, they eventually validate in wet lab experiments. Every validation becomes training data. Every bit of training data makes the next model better. This is a flywheel that public datasets can't replicate, because public databases like ENCODE (which Origin bootstrapped on) contain what researchers happened to measure. Origin gets to systematically query the design space in ways that no academic lab with limited grant money would bother to.

The 72% figure they cite - that 72% of their generated sequences show no alignment matches against each other - matters here. It means the model is genuinely exploring novel sequence space, not interpolating between known examples. When those sequences get experimentally validated, Origin learns things about regulatory DNA that nobody else has measured.

Across the 3,491 biotech and healthcare companies StartupHub.ai tracks, fewer than 20 from recent YC batches are attacking the gene expression control problem directly. Most are either tool builders (sequencing, lab automation), drug discovery platforms that take regulatory DNA as given, or cell therapy developers who are the natural customers for what Origin is building.

How It Stacks Up in Our Data

The closest companies in our tracker are doing adjacent work with different moats. Generate Biomedicines (StartupHub score: 71) uses generative AI for protein therapeutics rather than regulatory sequences - complementary, not competitive. CellType (score: 30) is building an agentic drug company using a 27B biological foundation model to simulate cell responses; they'd be a potential customer for Origin's regulatory sequences. Strand AI (score: 47) focuses on multimodal models for clinical trial patient selection - downstream of what Origin enables.

Nobody in our database is doing exactly what Origin does. That's either a good sign (whitespace) or a bad sign (there's a reason nobody's here). Given the technical results so far, it reads more like whitespace.

Difficulty Score

This is one of the harder technical stacks we've analyzed in this series. Here's the breakdown:

  • ML/AI: 9/10. Multitask Transformer architecture trained on genomic data, with both generative and predictive heads. The training methodology mirrors AlphaGenome's approach but with extensions for the generation task. The confidence-based sampling strategy is non-obvious. Outperforming DeepMind on a public benchmark is a meaningful bar.
  • Data: 10/10. The experimental validation pipeline is the hardest part of this company to replicate. You need wet labs, biological reagents, sequencing equipment, and researchers who understand what they're measuring. This isn't something you spin up in a weekend. It takes years and millions of dollars to build a dataset that trains a model that makes a dataset worth building.
  • Backend: 6/10. Standard ML serving infrastructure for inference, API layer for pharma customers, likely some workflow tooling for integrating with their wet lab pipeline. Nothing unusual here - the hard part is the model, not the serving.
  • Frontend: 3/10. B2B, selling to pharma and biotech companies. The interface is probably a portal with sequence input, prediction results, and ordering flows for custom designs. Not the competitive surface.
  • DevOps: 7/10. GPU training at scale, coordination between computational and wet lab workflows, regulatory considerations around genomic data handling. More complex than a typical SaaS but not hardware-level complexity.

The Moat: What's Hard, What's Not

The hard parts: the experimental validation dataset, the customer relationships with pharma companies (who move slowly and trust slowly), and the accumulated understanding of what works in which cell types for which indications. Those take years, not months.

The less-hard parts: the Transformer architecture (public), the ENCODE training data they bootstrapped on (public), the general idea of AI-designed regulatory sequences (multiple academic groups have published on this). A well-funded research lab with the right biological expertise could build a version of Axis. Beating the current Axis, or building the validation dataset Origin is accumulating, is a different question.

The real defensibility comes from the experimental validation loop. Each round of lab work teaches the model something nobody else has measured, in a cell type that's commercially relevant to a paying customer. If Origin can close enough deals to fund the next round of experiments, the dataset gap compounds against potential competitors over time.

The risk: pharma timelines are long, regulatory approval for any therapy using Origin's sequences will take years beyond Origin's validation data, and a well-capitalized academic spinout or existing biotools company could decide to enter this space with more resources. Origin is betting they can build enough of a lead before that happens.

Replicability Score: 80/100

An 80 means this is genuinely hard to clone, not impossible. The transformer architecture is not the moat - that's table stakes for anyone with a good ML team. The moat is the experimental validation dataset, built through expensive and time-consuming wet lab work that has to happen sequentially (you can't parallelize building biological knowledge across years of experiments). Add regulatory expertise and pharma relationships, and you're looking at a 3-5 year head start for a well-funded competitor starting today. For a scrappy startup, this might as well be uncloneable.

The 20 that makes it not an 80+ barrier: the public genomics datasets are substantial, the model architecture is published science, and if Axis produces strong commercial results, it will attract well-capitalized attention from existing biotools companies. Origin's window to build a defensible position is probably 18-24 months.

The Bet Worth Watching

Origin is trying to do something genuinely hard in a market that rewards hard: make gene therapy safer by solving the regulatory DNA precision problem. Their model beats DeepMind on a real benchmark. Their experimental validation strategy could build a dataset moat that's expensive to replicate. Their founders have the technical depth to execute on a problem that's unsolved not because nobody noticed it but because it's actually hard.

The question isn't whether the science works. The early results suggest it does. The question is whether four people can build enough of a dataset, sign enough pharma customers, and raise enough capital to stay ahead of what comes next when the industry notices what they're building.

YC W2026 has no shortage of "AI for X" plays where X is a generic enterprise workflow. Origin is AI for something that took molecular biology decades to characterize and still hasn't fully solved. That's a different category of hard, and it's the kind of hard that tends to produce enduring companies when it works.

© 2026 StartupHub.ai. All rights reserved. You may not republish this article in full without a license. Search engines and AI research tools may crawl and summarize for reference. Bulk reproduction or model training requires a license. See our terms.

Build This Startup with Claude Code

Complete replication guide, install as a slash command or rules file

# How to Build a Regulatory DNA Design Tool with Claude Code

A step-by-step guide to building an AI-powered system for designing and predicting regulatory DNA sequences, inspired by Origin's Axis model architecture.

## Step 1: Set Up the Database Schema

Design your data model to store regulatory DNA sequences, their cell-type predictions, and experimental validation results.

```sql
CREATE TABLE regulatory_sequences (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  sequence TEXT NOT NULL,
  length INTEGER GENERATED ALWAYS AS (char_length(sequence)) STORED,
  gc_content FLOAT,
  created_at TIMESTAMPTZ DEFAULT now()
);

CREATE TABLE cell_types (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name TEXT NOT NULL UNIQUE,
  tissue_type TEXT,
  disease_context TEXT,
  encode_cell_type_id TEXT
);

CREATE TABLE sequence_predictions (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  sequence_id UUID REFERENCES regulatory_sequences(id),
  cell_type_id UUID REFERENCES cell_types(id),
  predicted_expression FLOAT,
  predicted_accessibility FLOAT,
  tf_motif_enrichment JSONB,
  model_version TEXT,
  confidence_score FLOAT,
  created_at TIMESTAMPTZ DEFAULT now()
);

CREATE TABLE experimental_validations (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  sequence_id UUID REFERENCES regulatory_sequences(id),
  cell_type_id UUID REFERENCES cell_types(id),
  measured_expression FLOAT,
  assay_type TEXT, -- 'MPRA', 'STARR-seq', 'luciferase'
  replicate_count INTEGER,
  validated_at TIMESTAMPTZ DEFAULT now(),
  validated_by TEXT
);

CREATE INDEX ON sequence_predictions(sequence_id);
CREATE INDEX ON experimental_validations(sequence_id);
```

## Step 2: Build the Sequence Encoder

The core of the model takes DNA sequences and converts them to token embeddings that a Transformer can process.

```python
import torch
import torch.nn as nn

NUCLEOTIDES = {'A': 0, 'C': 1, 'G': 2, 'T': 3, 'N': 4, '[MASK]': 5, '[PAD]': 6}

class DNATokenizer:
    def __init__(self, max_length=512):
        self.max_length = max_length
        self.vocab = NUCLEOTIDES
    
    def encode(self, sequence: str) -> torch.Tensor:
        tokens = [self.vocab.get(nt.upper(), self.vocab['N']) for nt in sequence]
        if len(tokens) < self.max_length:
            tokens += [self.vocab['[PAD]']] * (self.max_length - len(tokens))
        return torch.tensor(tokens[:self.max_length], dtype=torch.long)
    
    def mask_random(self, tokens: torch.Tensor, mask_prob=0.15) -> tuple:
        mask = torch.rand(tokens.shape) < mask_prob
        masked = tokens.clone()
        masked[mask] = self.vocab['[MASK]']
        return masked, mask

class DNAEmbedding(nn.Module):
    def __init__(self, vocab_size=7, embed_dim=256, max_len=512):
        super().__init__()
        self.token_embed = nn.Embedding(vocab_size, embed_dim, padding_idx=NUCLEOTIDES['[PAD]'])
        self.position_embed = nn.Embedding(max_len, embed_dim)
    
    def forward(self, tokens):
        positions = torch.arange(tokens.shape[1], device=tokens.device).unsqueeze(0)
        return self.token_embed(tokens) + self.position_embed(positions)
```

## Step 3: Implement the Shared Transformer Backbone

Build the multitask architecture with a shared backbone and separate prediction/generation heads.

```python
class SharedTransformerBackbone(nn.Module):
    def __init__(self, embed_dim=256, num_heads=8, num_layers=6, dropout=0.1):
        super().__init__()
        encoder_layer = nn.TransformerEncoderLayer(
            d_model=embed_dim,
            nhead=num_heads,
            dim_feedforward=embed_dim * 4,
            dropout=dropout,
            batch_first=True
        )
        self.transformer = nn.TransformerEncoder(encoder_layer, num_layers=num_layers)
    
    def forward(self, embeddings, padding_mask=None):
        return self.transformer(embeddings, src_key_padding_mask=padding_mask)

class NucleotideGenerationHead(nn.Module):
    def __init__(self, embed_dim=256, vocab_size=5):
        super().__init__()
        self.proj = nn.Linear(embed_dim, vocab_size)
    
    def forward(self, hidden_states):
        return self.proj(hidden_states)  # [batch, seq_len, 4 nucleotides + N]

class ExpressionPredictionHead(nn.Module):
    def __init__(self, embed_dim=256, num_cell_types=64):
        super().__init__()
        self.cell_type_embed = nn.Embedding(num_cell_types, embed_dim)
        self.pooling = nn.AdaptiveAvgPool1d(1)
        self.predictor = nn.Sequential(
            nn.Linear(embed_dim * 2, embed_dim),
            nn.ReLU(),
            nn.Linear(embed_dim, 1)
        )
    
    def forward(self, hidden_states, cell_type_ids):
        pooled = hidden_states.mean(dim=1)
        cell_embed = self.cell_type_embed(cell_type_ids)
        combined = torch.cat([pooled, cell_embed], dim=-1)
        return self.predictor(combined).squeeze(-1)

class AxisModel(nn.Module):
    def __init__(self, embed_dim=256, num_heads=8, num_layers=6, num_cell_types=64):
        super().__init__()
        self.embedder = DNAEmbedding(embed_dim=embed_dim)
        self.backbone = SharedTransformerBackbone(embed_dim, num_heads, num_layers)
        self.gen_head = NucleotideGenerationHead(embed_dim)
        self.pred_head = ExpressionPredictionHead(embed_dim, num_cell_types)
    
    def forward(self, tokens, cell_type_ids=None, task='both'):
        embeddings = self.embedder(tokens)
        hidden = self.backbone(embeddings)
        
        outputs = {}
        if task in ('generation', 'both'):
            outputs['logits'] = self.gen_head(hidden)
        if task in ('prediction', 'both') and cell_type_ids is not None:
            outputs['expression'] = self.pred_head(hidden, cell_type_ids)
        return outputs
```

## Step 4: Implement Confidence-Based Iterative Generation

The key innovation: generate sequences position-by-position based on model confidence, not randomly.

```python
import torch.nn.functional as F

def generate_regulatory_sequence(
    model: AxisModel,
    tokenizer: DNATokenizer,
    target_length: int,
    cell_type_id: int,
    temperature: float = 0.8,
    num_steps: int = None
) -> str:
    model.eval()
    device = next(model.parameters()).device
    
    if num_steps is None:
        num_steps = target_length
    
    # Start fully masked
    tokens = torch.full((1, target_length), NUCLEOTIDES['[MASK]'], dtype=torch.long, device=device)
    
    with torch.no_grad():
        for step in range(num_steps):
            outputs = model(tokens, task='generation')
            logits = outputs['logits']  # [1, seq_len, vocab_size]
            
            # Compute per-position entropy (uncertainty)
            probs = F.softmax(logits[:, :, :4] / temperature, dim=-1)
            entropy = -(probs * probs.log()).sum(dim=-1)  # [1, seq_len]
            
            # Only consider still-masked positions
            masked_positions = (tokens[0] == NUCLEOTIDES['[MASK]']).nonzero(as_tuple=True)[0]
            if len(masked_positions) == 0:
                break
            
            # Pick the LOWEST entropy masked position (most confident)
            masked_entropy = entropy[0, masked_positions]
            most_confident_idx = masked_positions[masked_entropy.argmin()]
            
            # Sample from that position's distribution
            position_probs = probs[0, most_confident_idx]
            chosen_nucleotide = torch.multinomial(position_probs, 1).item()
            tokens[0, most_confident_idx] = chosen_nucleotide
    
    # Decode
    idx_to_nt = {v: k for k, v in NUCLEOTIDES.items() if k not in ('[MASK]', '[PAD]')}
    return ''.join(idx_to_nt.get(t.item(), 'N') for t in tokens[0])
```

## Step 5: Build the Training Pipeline

Train on ENCODE data with a combined loss that handles both generation and expression prediction tasks.

```python
from torch.optim import AdamW
from torch.optim.lr_scheduler import CosineAnnealingLR

def combined_loss(gen_logits, gen_targets, gen_mask, pred_expression, true_expression):
    gen_loss = 0.0
    if gen_mask.any():
        gen_loss = F.cross_entropy(
            gen_logits[gen_mask].view(-1, gen_logits.shape[-1]),
            gen_targets[gen_mask].view(-1)
        )
    
    # Factorized Poisson + multinomial loss for expression prediction
    pred_loss = 0.0
    if true_expression is not None:
        log_pred = pred_expression
        pred_loss = F.poisson_nll_loss(log_pred, true_expression, log_input=True)
    
    return gen_loss + 0.5 * pred_loss

def train_epoch(model, dataloader, optimizer, device):
    model.train()
    tokenizer = DNATokenizer()
    total_loss = 0.0
    
    for batch in dataloader:
        sequences = batch['sequences'].to(device)
        cell_types = batch['cell_types'].to(device)
        expression = batch['expression'].to(device)
        
        masked_seqs, masks = tokenizer.mask_random(sequences)
        
        outputs = model(masked_seqs, cell_type_ids=cell_types)
        loss = combined_loss(
            outputs['logits'], sequences, masks,
            outputs['expression'], expression
        )
        
        optimizer.zero_grad()
        loss.backward()
        torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
        optimizer.step()
        total_loss += loss.item()
    
    return total_loss / len(dataloader)
```

## Step 6: Design the API Layer

Expose generation and prediction endpoints for pharma customers to integrate with their workflows.

```python
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import uuid

app = FastAPI(title="Regulatory DNA Design API")

class GenerateRequest(BaseModel):
    target_length: int
    cell_type: str
    temperature: float = 0.8
    n_candidates: int = 10

class PredictRequest(BaseModel):
    sequences: list[str]
    cell_types: list[str]

@app.post("/generate")
async def generate_sequences(req: GenerateRequest):
    cell_type_id = get_cell_type_id(req.cell_type)
    if cell_type_id is None:
        raise HTTPException(404, f"Cell type '{req.cell_type}' not found")
    
    candidates = []
    for _ in range(req.n_candidates):
        seq = generate_regulatory_sequence(
            model, tokenizer,
            target_length=req.target_length,
            cell_type_id=cell_type_id,
            temperature=req.temperature
        )
        gc = (seq.count('G') + seq.count('C')) / len(seq)
        candidates.append({
            "id": str(uuid.uuid4()),
            "sequence": seq,
            "gc_content": gc,
            "length": len(seq)
        })
    
    return {"candidates": candidates, "cell_type": req.cell_type}

@app.post("/predict")
async def predict_expression(req: PredictRequest):
    results = []
    for seq, ct in zip(req.sequences, req.cell_types):
        cell_type_id = get_cell_type_id(ct)
        tokens = tokenizer.encode(seq).unsqueeze(0)
        ct_tensor = torch.tensor([cell_type_id])
        
        with torch.no_grad():
            outputs = model(tokens, cell_type_ids=ct_tensor, task='prediction')
        
        results.append({
            "sequence": seq[:20] + "...",
            "cell_type": ct,
            "predicted_expression": outputs['expression'].item()
        })
    
    return {"predictions": results}
```

## Step 7: Deploy with GPU Inference and Wet Lab Integration

Set up production deployment with GPU inference and workflow integration for experimental validation.

```yaml
# docker-compose.yml
services:
  api:
    image: regulatory-dna-api:latest
    environment:
      - MODEL_PATH=/models/axis_v1.pt
      - DATABASE_URL=${DATABASE_URL}
      - GPU_DEVICE=cuda:0
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    ports:
      - "8000:8000"
  
  worker:
    image: regulatory-dna-worker:latest
    environment:
      - REDIS_URL=${REDIS_URL}
      - DATABASE_URL=${DATABASE_URL}
    command: python worker.py --queue validation_pipeline
```

```python
# worker.py - handles experimental validation ingestion
import redis
import json
from db import upsert_validation

def process_validation_result(job_data: dict):
    """Ingest wet lab validation results and update training dataset."""
    validation = {
        "sequence_id": job_data["sequence_id"],
        "cell_type_id": job_data["cell_type_id"],
        "measured_expression": job_data["expression_value"],
        "assay_type": job_data["assay"],
        "replicate_count": job_data["n_replicates"]
    }
    upsert_validation(validation)
    
    # Flag for next training run if enough new data accumulated
    check_retrain_threshold()

def check_retrain_threshold(min_new_sequences=500):
    new_count = count_unincorporated_validations()
    if new_count >= min_new_sequences:
        trigger_training_job()
```

**Key architectural decisions:**
- Store all generated sequences in Postgres immediately, even before validation - the sequence space exploration data has value
- Use async job queues (Redis + Celery) for generation requests that take >2 seconds
- Pin model weights in GPU VRAM between requests to eliminate cold-start latency
- Build a validation ingestion pipeline early - the experimental data is the moat, and you need a clean system for getting it into the training loop fast
- Track which sequences were generated for which customers, so you can weight customer-relevant cell types higher in future training runs
claude-code-skills.md