Off-target and variant-aware checks
After a design completes, the results screen has two specificity tabs. They're both optional — the design itself doesn't run them automatically — but they catch failure modes that aren't obvious from primer-quality metrics alone.
When to use which
- Off-target— “does this primer bind anywhere else in the genome where I don't want it to?”
- Variants— “does the patient I might apply this primer to carry a common SNP at the 3' end that would stop the primer extending?”
Both are worth running before ordering. They take seconds for typical primer batches.
Off-target check
Aligns every primer sequence against the chosen reference genome with bowtie2 -k 200(up to 200 alignments per primer reported). Hits at the primer's own genomic location are expected; anything else is a specificity risk.
Mismatch budget
- 0 (strictest) — exact matches only. Use when designing for a clean assay where any partial bind is bad news.
- ≤1 (default) — catches the common case: a single nucleotide of slop is enough to amplify off-target with relaxed PCR.
- ≤2 — paranoid. Reports many more candidate sites; most are weak binders.
- ≤3 (permissive) — reserved for unusual cases (degenerate primers, highly repetitive regions).
Implementation
The check fans out to one Cloud Run service per assembly, each hosting a bowtie2 index for its genome on a GCS Fuse mount. The human service is always-warm (response < 5 s for a typical primer pair); other species cold-start in ~70 s on first invocation each session.
Variants check
Scans the 3' last 5 ntof every primer against a common-variant index sourced from gnomAD v4.1. A variant at the 3' end is far worse than one further upstream: extension fails outright in the variant carrier, producing silent dropout for that patient.
MAF threshold
- ≥5% (very common) — only catches the textbook polymorphisms. Use when designing for a homogeneous study cohort.
- ≥1% (default) — standard “common variant” cutoff. Anything more frequent than 1% in the general population is excluded.
- ≥0.1% (clinical-paranoid) — clinical-grade assays where you can't afford even rare carriers dropping out.
Implementation
Variant rows live in Postgres (gnomAD v4.1 genomes, filtered to AF ≥ 0.01 by the loader). Loaded per chromosome — at end of M4 all 24 autosome/X/Y chromosomes are populated, ~10 M rows total. The check does one indexed range query per chromosome touched by the primer set; typical wall time is < 100 ms.
What if my primer fails one of these?
Both checks are informational — the design itself doesn't hide flagged primers. The remedy is to step back to the wizard and adjust either the amplicon range (Step 3) or the design parameters (Step 4), then re-run. Tightening overlap and bumping amplicon size usually gives the solver enough room to find clean alternatives.
