Docs and methods
Drybench Sequence.
How the sequence app turns a paste into translations, ORFs, molecular weights, isoelectric points, extinction coefficients, melting temperatures and hairpin and dimer free energies, what it lets you take away, how each method is checked against a named oracle, and what stays local and what an explicit UniProt search sends.
Updated 9 October 2026 · v0.8.0
Find a protein sequence
In the workspace, Find a protein sequence accepts a gene, protein name or accession. Typing offers local suggestions; Search UniProt explicitly sends the query for broader matches. Selecting a match retrieves its full canonical record and opens it directly in an unchanged empty editor. Existing input requires confirmation with the accession, organism and residue count, and any named work is saved first. If inputs or ownership change during retrieval, nothing is replaced; review the source preview and choose Use sequence when ready. The imported FASTA and saved inputs retain source metadata and the full sequence even when it is too long for a share link. Editing the import does not recheck it against UniProt. DNA and RNA remain paste/import inputs; this is not a nucleotide database search.
Methods
What the app shows, how it works and how it was built, in the words of its own write-up, followed by the parameter defaults and the data sources with their licences.
What it does
One paste, every everyday operation: reverse complement, translation in any frame with any NCBI genetic code, all six frames, open reading frames, GC percent, the molecular weight of a DNA or RNA strand, motif search with IUPAC codes, and for a protein its molecular weight, isoelectric point and extinction coefficient at 280 nm, with the affinity tags and protease sites it carries found and the numbers given before and after cleavage. For oligos, the nearest-neighbour melting temperature with named salt and magnesium corrections, the pair's ΔTm with an annealing temperature stated as the rule of thumb it is, hairpin and dimer ΔG at 37 °C, the sites where a primer binds a template, and candidate primer pairs for a target region of a template, enumerated within it under stated constraints and each checked for one exact product.
Each operation has its own page that answers above the fold for a worked example and recomputes as you type, with a copy button and the method, constants and verification badge beneath; the workspace holds the paste and shows every operation on it. Raw letters, FASTA, multi-FASTA and GenBank records are read, the alphabet is detected and shown, and ambiguity codes are kept where the operation allows them and refused by name where it does not.
How it works
The numbers come from one pure module the suite shares (seq): the same molecular weight and extinction coefficient the protein and calculator apps show, the genetic code tables parsed from NCBI's published file, SantaLucia's 1998 nearest-neighbour parameters with the Owczarzy 2004 and 2008 salt corrections, and the SantaLucia and Hicks 2004 loop, mismatch and dangling-end increments for hairpins and dimers, every parameter transcribed from the paper it cites. The scientific methods run locally. In the workspace, optional UniProt lookup sends only submitted search text and selected accessions; pasted input is not sent. Scientific use needs no account; optional Bench sign-in uses session cookies. Inputs under 100 kb are computed on the page as you type; longer ones, to a limit of 1 Mb, run in a Web Worker that never fetches.
The link keeps your inputs after the # of the address, never a result: a nucleotide sequence is packed two bits a base, a protein deflated, and a paste too long for a link stays in this browser and travels to another app as a sequence object. A paste you pin, send or add to a study becomes a sequence object; a tagged protein you keep becomes a construct. Versioned example links (insulin@1 and the others) pin the method versions, so a teaching link gives the same numbers next year.
How it is checked
Each method is compared with a named external oracle on a published fixture set, never with its own output: 22 proteins and peptides against Expasy ProtParam's saved responses for molecular weight, isoelectric point and ε280; 45 oligos against Biopython's MeltingTemp under both concentration models with every salt regime; 20 hairpin and dimer cases and 11 salt probes against Primer3's ntthal; 108 frame translations and 5 annotated coding sequences against Biopython; 18 ORF cases against an independent scan cross-checked with NCBI ORFfinder; 5 DNA molecular weights by hand; and 101 peptides against RDKit's MolFromSequence for the SMILES sent to the molecule app. The fixture files, their hashes and the scripts that wrote them are published on the verification page, and each badge names the oracle, its version, the count, the tolerance and the date.
Equations and defaults
- Reading a paste
- Letters outside A to Z, * and - are dropped; the alphabet is detected as nucleotide when at least 90 percent of the letters are A, C, G, T, U or N, with the confidence shown, and a FASTA header's alphabet= field or a GenBank LOCUS line overrides the detection. Accessions in a header (UniProt, RefSeq, GenBank) become aliases of the sequence object.
- Reverse complement
- Each base to its Watson-Crick complement and each IUPAC code to the code of its complementary set (R to Y, K to M, B to V, D to H; S, W and N to themselves), the result read 3′ to 5′; U pairs with A for RNA.
- Translation
- NCBI genetic code tables version 4.6 (gc.prt, last modified 10 June 2020), table 1 by default; a frame starts at its first complete codon; * marks a stop; an ambiguity code gives X unless every base it stands for gives one amino acid; alternative initiation codons are off unless turned on, and then only the first codon is read as Met.
- Open reading frames
- From ATG (or the table's initiation codons when turned on) to the next in-frame stop on both strands; the coding length counts to the codon before the stop and must reach 75 nt by default; an ORF whose span lies inside another's is nested and hidden by default; ORFs without a stop before the sequence ends are listed apart. These are NCBI ORFfinder's conventions, adopted on 6 October 2026.
- Protein molecular weight
- The sum of ExPASy ProtParam's average residue masses plus water, the table the protein app has always used (id protparam); a table derived from the IUPAC CIAAW 2021 atomic weights sits behind the id ciaaw-2021 and reads higher by 0.03 Da per 100 residues on the fixtures.
- Isoelectric point
- Bisection on the net charge over pH 0 to 14 with the Bjellqvist pK values as ProtParam applies them, including a C-terminal pK of 3.55 whatever the last residue (confirmed on the fixtures); never a bound of the search.
- ε280 and A280
- Pace et al. 1995: 5,500 per Trp, 1,490 per Tyr and 125 per cystine, in both cysteine conventions; the absorbance of a 1 g/L solution is ε280 divided by the molecular weight.
- Tags and protease sites
- Nine peptide tags (His6 to His10, FLAG, HA, c-Myc, Strep-tag II, V5, S, Avi, T7) and five protease motifs (TEV ENLYFQ|G/S, thrombin LVPR|GS, Factor Xa I(E/D)GR|, HRV 3C LEVLFQ|GP, enterokinase DDDDK|) found by their published motifs; a cut is proposed at the site nearest an end and applied only when you confirm it; the SUMO protease has no motif and is not detected.
- Oligo Tm
- ΔH° and ΔS° from SantaLucia 1998 Table 2 (ten stacks, initiation with a terminal G·C or A·T, the symmetry term for a self-complementary oligo); Tm = ΔH°/(ΔS° + R ln(C/x)) − 273.15 with R = 1.987 cal K⁻¹ mol⁻¹; primer in excess (x = 1 with the primer's concentration) by default, equal strands (x = 4, or 1 with the symmetry term) as the named alternative; only A, C, G and T are read.
- Salt corrections
- Owczarzy 2004 equation 22 for monovalent ions by default (Na⁺ + K⁺ + Tris⁺/2); Owczarzy 2008 equations 16 and 18 to 20 whenever Mg²⁺ is present, with free Mg²⁺ after dNTP binding (Ka = 3 × 10⁴ M⁻¹) and the regime chosen by R = √[Mg²⁺]/[Mon⁺] exactly as published (R < 0.22 the monovalent equation; 0.22 ≤ R < 6 adjusted constants; R ≥ 6 the original constants), never smoothed, with a note when R is within 10 percent of a boundary; SantaLucia 1998 equation 7 as entropy as the alternative without Mg²⁺.
- Fitted ranges and refusals
- Owczarzy 2004 was fitted at 69 mM to 1.02 M Na⁺; the 50 mM default sits below that measured range. It is accepted, with 20 to 69 mM, as an extrapolation whose error has not been established here: Owczarzy 2008 places typical PCR buffers (20 to 100 mM monovalent) in the regime where this equation applies, though neither paper reports a fit below 69 mM. Outside 20 to 1,020 mM the Tm carries a fitted-range note. The Owczarzy 2008 free Mg²⁺ range, recalled as 0.5 to 600 mM, is marked unverified until the paper is read; SantaLucia 1998's range has not been read. Conditions no supported buffer reaches are refused: monovalent above 2,000 mM, Mg²⁺ above 1,000 mM, dNTPs above 100 mM, the oligo outside 1 pM to 1 mM, or monovalent below 1 mM with free Mg²⁺ below 0.1 mM.
- Primer pair
- ΔTm is the difference of the two Tm values; the annealing temperature is the lower Tm less 5 °C, a rule of thumb stated as such; with Mg²⁺ = 0 the Tm values use the monovalent correction, so a PCR buffer's Mg²⁺ should be set.
- Hairpin and dimer ΔG°37: the structure class
- Two-state secondary structures of one or two DNA oligos: Watson-Crick stacks, bulges, internal loops of at most 30 bases, hairpin loops of at least 3, dangling ends and terminal mismatches at helix ends, no multibranch loops, oligos of at most 100 bases. The structure reported is the one with the lowest ΔG°37 over every structure, scored at 1 M NaCl and corrected for salt as entropy.
- Hairpin and dimer ΔG°37: sources
- SantaLucia and Hicks 2004, Annu Rev Biophys Biomol Struct 33:415-440, Tables 1 to 4 and equations 7 to 13, read 6 October 2026 (initiation +0.2 kcal/mol and −5.7 cal K⁻¹ mol⁻¹, terminal A·T +2.2 and +6.9, internal single mismatches, loop initiation by length with the Jacobson-Stockmayer extrapolation 2.44 RT ln(n/x) between listed lengths and the value for 30 beyond, 0.3 kcal/mol per base of internal-loop asymmetry); the Watson-Crick stacks from SantaLucia 1998 Table 2 (read 6 October 2026); the 32 dangling ends from Bommarito, Peyret and SantaLucia 2000 as Table 3 of the 2004 review reprints them (read 6 October 2026); the hairpin terminal-mismatch increments from the Nearest Neighbor Database's DNA table (rna.urmc.rochester.edu/NNDB, read and saved 6 October 2026), the only public source of the values the review attributes to Varma and SantaLucia (unpublished).
- Hairpin and dimer ΔG°37: conventions, as Primer3's thal, inferred from its output
- Each of these fills a gap the paper leaves and was inferred from ntthal's output on the fixtures and its man page, not from its code: a terminal mismatch at a duplex end or inside an internal loop is the sum of the two dangling-end increments; a destabilising dangling end at a helix end is left off; a first mismatch in a 4-base hairpin loop that would be Watson-Crick (and so cannot pair) stacks as that pair would, and in a longer loop its bases count as two dangling ends; a 3-base loop closed by A·T takes the terminal A·T penalty; a bulge of 1 keeps the stack across it and longer bulges take the A·T penalties of both closing pairs; no symmetry correction for a self-dimer; salt by the sodium equivalent Na⁺ + 120 √(Mg²⁺ − dNTP) mM (von Ahsen 2001, as the Primer3 manual states), as 0.368 ln[Na⁺]eq cal K⁻¹ mol⁻¹ per pair beyond the first.
- Hairpin and dimer ΔG°37: departures from ntthal, with their size
- Selection: ntthal reports the structure with the highest melting temperature (its man page); this app reports the lowest ΔG°37, so the two can show different structures and ntthal a less negative ΔG; on the fixtures the structures coincide on 19 of 27 cases with a structure and differ by up to 3.6 kcal/mol where they do not (the H08 hairpin). Salt: ntthal counts one pair fewer for a hairpin whose stem includes the oligo's last base; this app counts every pair, so ntthal reads lower by one salt step, up to 0.37 kcal/mol on H01, H02, H04, H06 and H07. Flanks: two complementary bases flanking a duplex end or a hairpin's open end earn no credit here (they pair, or they count nothing), where ntthal keeps a single dangling end (0.23 kcal/mol on H08). The gate: ntthal's own structures rescored under these rules within 0.4 kcal/mol on all 15 hairpin fixtures and 0.1 on all 16 dimer fixtures, this app's structure never less stable than ntthal's, and the four no-structure cases held; the per-case table is below under Verification.
- Hairpin and dimer ΔG°37: unchecked classes
- The special 3- and 4-base loop bonuses of SantaLucia and Hicks 2004 (their supplementary table was not available) are not applied, so hairpins with GNA or GNRA loops come out less stable than they are; on the two probe cases ntthal is more stable by 1.5 (GNRA) and 2.3 kcal/mol (GNA). Bulges agree with ntthal within 0.01 kcal/mol on the two probe cases but are not gated. Asymmetric internal loops follow equation 12 of the review; on the one 2×3 probe this app is 1.7 kcal/mol more stable than ntthal, so the rule is marked unchecked until more cases are measured.
- Hairpin and dimer ΔG°37: the search check
- On 200 seeded random oligos per engine (hairpins of 10 to 14 bases, dimers of 5 to 8 bases each) every structure is enumerated outright and scored by the same rules; the dynamic programme's minimum equals that minimum on every one (src/lib/seq/structure.test.ts).
- DNA and RNA molecular weight
- The residue formulas of the nucleoside 5′-monophosphates less water (dA C10H12N5O5P, dC C9H12N3O6P, dG C10H12N5O6P, dT C10H13N2O7P; the ribonucleotides with one more oxygen), summed with the IUPAC CIAAW 2021 atomic weights; a linear strand gains water and loses a phosphate group for its 5′-OH end unless the 5′-phosphate is chosen; double-stranded adds the complementary strand; circular adds nothing. The result is a neutral free acid.
- GC percent
- (G + C + S) over (A + C + G + T + U + S + W); the other IUPAC codes are left out of both counts, and the result is undefined when nothing can be counted.
- Motif search and binding sites
- Each IUPAC code matches its set of bases, on both strands of DNA when asked; a protein motif matches letter for letter. A primer's binding sites are the places on either strand where its 3′ six bases match exactly and the rest has at most the allowed mismatches; a product runs from a forward site to the next reverse site.
- Predicted PCR product (exact-pair-v1)
- Each primer's annealing part, or its reverse complement, is matched base for base on an A, C, G and T template of at most 50,000 bases, on both strands; a circular template is read once around, so a site or a product may cross the origin. A site's start is the primer's 5′ end and its end the 3′ end, 1-based on the top strand. A product runs from the forward primer's 5′ end to the reverse primer's 5′ end, read 5′ to 3′ from the forward primer, with the forward tail before it and the reverse tail, reverse complemented, after it; tails never count towards the annealing length. Pairs whose footprints overlap are counted and build no product. Every product is listed, never the first chosen: none, unique or ambiguous. More than 100 sites for one primer or more than 100 products refuse, since the list would be incomplete. Annealing parts of 8 to 200 bases and tails of at most 200. Mismatches, single-primer products and added bases are not modelled; the product is a sequence construction, not evidence of amplification or of specificity in a genome.
- Primer design (bounded-flanks-v1)
- A bounded enumeration within the pasted A, C, G and T template (at most 50,000 bases, linear or circular): candidate windows of the chosen lengths whose 3′ ends sit 0 to the chosen flank (at most 200 bases) before the target's first base and after its last, read around the circle when circular; a window is rejected, under the first reason that applies and counted, when it falls off a linear template, touches the target or an excluded region, or has a GC or a nearest-neighbour Tm (annealing part alone, the primer in excess, the panel's conditions) outside the bounds. Each side is ranked by |Tm − preferred Tm| + 0.2 × |length − preferred length| and cut to 24; the pairs are ranked by the two Tm departures, 0.2 times the two length departures and the pair's ΔTm, after the product length (tails included) and ΔTm bounds; the best 24 pairs are checked by the exact-pair method for one exact product at the designed sites and the first 5 that pass are returned, each with its exact site and product counts. A search cut at any cap is reported as capped. No Tm of a tailed oligo, no annealing temperature, no genome specificity, no mismatched binding and no amplification outcome is derived.
- Fragment search in saved sequences
- A query of 4 to 10,000 A, C, G and T bases (spaces and line breaks removed, nothing else) and its reverse complement are matched base for base on the saved, presented strand of each saved DNA sequence. An IUPAC code in a saved sequence is a literal letter no query base matches, never a wildcard, and the query itself is never a pattern. Overlapping hits are all kept; a palindromic query's hit is reported once, as both strands. Coordinates are 1-based and inclusive on the saved strand whatever the strand of the hit; on a circular molecule each start is read once and a hit across the origin is marked.
- Peptides as SMILES
- A linear peptide of the 20 standard L-amino acids with free amine and acid ends, neutral, cysteines as free thiols, drawn as RDKit's MolFromSequence draws it, for the molecule app; up to 2,000 residues; a trailing stop is dropped and any other letter refuses the peptide by name.
- Links
- A nucleotide sequence travels packed two bits a base (the b: payload), a protein deflated (z:) or plain, and a sequence too long for a link stays in this browser; the operation, frame, genetic code, motif and conditions travel as plain keys after the # of the address.
Data sources, licences and versions
Sources and licences
NCBI genetic code tables
NCBI genetic code tablesPublic domain (NCBI)The 27 translation tables (gc.prt version 4.6) parsed into the app at build time: codons, amino acids and initiation codons.
NCBI Taxonomy. The Genetic Codes, gc.prt version 4.6, last modified 10 June 2020; fetched 6 October 2026.
ExPASy ProtParam residue masses and pK values
ExPASy ProtParam residue masses and pK valuesValues cited from the documentationThe average residue masses and the Bjellqvist pK values the protein app has always used, kept as the default so the two apps give one number; a CIAAW-derived residue table sits behind a second id.
Gasteiger E, Hoogland C, Gattiker A, et al. Protein identification and analysis tools on the ExPASy server. In: The Proteomics Protocols Handbook. Humana Press; 2005:571-607. Documentation read 5 October 2026. ProtParam is a tool of the SIB Swiss Institute of Bioinformatics; not affiliated.
Bjellqvist et al. 1993 and 1994, isoelectric point
Bjellqvist et al. 1993 and 1994, isoelectric pointMethod (cited)The pK values of the charged residues and the termini, with bisection on the net charge over pH 0 to 14.
Bjellqvist B, Hughes GJ, Pasquali C, et al. Electrophoresis 1993;14:1023-1031; Bjellqvist B, Basse B, Olsen E, Celis JE. Electrophoresis 1994;15:529-539.
Pace et al. 1995, molar absorption coefficients
Pace et al. 1995, molar absorption coefficientsMethod (cited)ε280 = 5,500 per Trp + 1,490 per Tyr + 125 per cystine, in both conventions (all cysteines paired, all reduced).
Pace CN, Vajdos F, Fee L, Grimsley G, Gray T. How to measure and predict the molar absorption coefficient of a protein. Protein Sci 1995;4:2411-2423.
SantaLucia 1998, unified nearest-neighbour parameters
SantaLucia 1998, unified nearest-neighbour parametersValues cited from the published tableΔH° and ΔS° of the ten Watson-Crick stacks, the initiation, terminal A·T and symmetry terms, for oligo Tm and for the stacks of hairpins and dimers.
SantaLucia J Jr. A unified view of polymer, dumbbell, and oligonucleotide DNA nearest-neighbor thermodynamics. Proc Natl Acad Sci USA 1998;95:1460-1465. Table 2 read 6 October 2026.
Owczarzy et al. 2004, sodium correction
Owczarzy et al. 2004, sodium correctionMethod (cited)The monovalent salt correction of 1/Tm (equation 22), the default without Mg²⁺.
Owczarzy R, You Y, Moreira BG, et al. Effects of sodium ions on DNA duplex oligomers: improved predictions of melting temperatures. Biochemistry 2004;43:3537-3554.
Owczarzy et al. 2008, magnesium correction
Owczarzy et al. 2008, magnesium correctionMethod (cited)The Mg²⁺ and mixed-cation correction (equations 16 and 18 to 20), with the regime chosen by R = √[Mg²⁺]/[Mon⁺] exactly as published and free Mg²⁺ after dNTP binding.
Owczarzy R, Moreira BG, You Y, Behlke MA, Walder JA. Predicting stability of DNA duplexes in solutions containing magnesium and monovalent cations. Biochemistry 2008;47:5336-5353.
SantaLucia and Hicks 2004, DNA structural motifs
SantaLucia and Hicks 2004, DNA structural motifsValues cited from the published tablesLoop initiation by length, the internal mismatch increments, the initiation and terminal A·T terms and the rules for hairpins, bulges, internal loops and dangling ends, for hairpin and dimer ΔG at 37 °C.
SantaLucia J Jr, Hicks D. The thermodynamics of DNA structural motifs. Annu Rev Biophys Biomol Struct 2004;33:415-440. Tables 1 to 4 read 6 October 2026.
Bommarito, Peyret and SantaLucia 2000, dangling ends
Bommarito, Peyret and SantaLucia 2000, dangling endsValues cited from the published tableΔH° and ΔG°37 of the 32 single-nucleotide dangling ends, for helix ends and terminal mismatches in hairpins and dimers.
Bommarito S, Peyret N, SantaLucia J Jr. Thermodynamic parameters for DNA sequences with dangling ends. Nucleic Acids Res 2000;28:1929-1934, as SantaLucia and Hicks 2004 Table 3 reprints it; read 6 October 2026.
Nearest Neighbor Database (NNDB), DNA terminal mismatches
Nearest Neighbor Database (NNDB), DNA terminal mismatchesValues cited from the public table; licence to be checkedThe ΔG°37 increments of the first mismatch in a hairpin loop, which SantaLucia and Hicks 2004 attribute to Varma and SantaLucia (unpublished); the database is their only public source, and only this table is read from it.
Turner DH, Mathews DH. NNDB: the nearest neighbor parameter database for predicting stability of nucleic acid secondary structure. Nucleic Acids Res 2010;38:D280-D282; Mittal A, Turner DH, Mathews DH. Nucleic Acids Res 2024. Table read and saved 6 October 2026.
IUPAC CIAAW standard atomic weights 2021
IUPAC CIAAW standard atomic weights 2021Values cited from the published tableThe molecular weight of a DNA or RNA strand from its residue formulas, the conventional value for each interval element, as exact decimals held in one table under src/lib.
Prohaska T, Irrgeher J, Benefield J, et al. Standard atomic weights of the elements 2021 (IUPAC Technical Report). Pure Appl Chem 2022;94:573-600. ciaaw.org read 6 October 2026.
UniProtKB (UniProt REST API)
UniProtKB (UniProt REST API)CC BY 4.0Explicit protein search and full canonical sequence lookup, retaining accession, organism, release and retrieval date
The UniProt Consortium. UniProt: the Universal Protein Knowledgebase in 2025. Nucleic Acids Res 2025;53:D609-D617.
Times on screen are local time with the UTC offset; times in exports are UTC. Dates with no time are shown at the precision the source gave them.
Exports
The Export menu offers the results as CSV (the ORF, primer, Tm and binding-site tables with units in the headers, the method and constants table per row, with the provenance sidecar), the pasted sequence as FASTA with its alphabet in the header (the sequence payload another app reads back), and the paste and operation on screen as a printed handout with the method block. Copy link puts the sequence and the settings after the # of the address; the method block copies as text.
Release gate: before the app leaves the preview, its exports and printed reports will carry the data versions, parameters, limits and a timestamp needed to reproduce a result, as the regulatory position says. This section will describe each format as it ships.
Verification
Each module below is a set of automated tests in the app's source code, with the expected results written into the tests. They check the app's logic against recorded inputs and stored reference records; none of them calls a live service.
- src/lib/seq/translate.test.ts and orf.test.ts
- 108 frame translations and 5 annotated coding sequences against Biopython exactly, and 18 ORF cases field by field against the independent scan cross-checked with Biopython and NCBI ORFfinder, from pipeline/sequence-toolkit/fixtures.
- src/lib/seq/protein.test.ts
- 22 proteins and peptides against Expasy ProtParam's saved responses: molecular weight within 0.01 Da, pI within 0.01 and never a bound, ε280 exact; the CIAAW table's difference measured beside them.
- src/lib/seq/tm.test.ts
- 45 oligos against Biopython MeltingTemp.Tm_NN within 0.1 °C under both concentration models, the Owczarzy 2008 regime exact, the seven refusals and three acceptance cases exact.
- src/lib/seq/structure.test.ts
- The hairpin and dimer gate against ntthal: its own structures rescored within the tolerance on every case, this app's structure never less stable, the no-structure cases held, and the search check on 200 random oligos per engine; the five loop-class probes reported, not gated.
- src/lib/seq/dna-mw.test.ts and peptide.test.ts
- 5 DNA molecular weights against hand arithmetic within 0.01 g/mol; 89 peptides as SMILES against RDKit's canonical form and 12 refusals exact.
- src/lib/seq/primer-design-fixtures.test.ts
- 9 primer-design cases and 4 refusals against the independent derivation (every melting temperature from Biopython, the windows, counts, ranking and caps derived in the script, exact binding by the exact-match derivation, one case worked by hand): every returned pair, coordinate, product, count and cap exact, Tm and ranking terms within 1e-6 °C.
- pipeline/sequence-toolkit/fixtures.test.ts
- Every fixture file matches the sha256 the oracle scripts recorded in the manifest, with their case counts and the rulings that shaped them.
- pipeline/sequence-toolkit/reference.py and peptides.py
- The oracle scripts (Python 3.11 with the pinned requirements): Biopython 1.88, primer3-py 2.3.1, NCBI ORFfinder 0.4.3, the saved ProtParam responses, exact rational arithmetic and RDKit 2026.03.6; they write the fixtures and their hashes.
Release gate: before the app leaves the preview, each release will publish a verification dataset with expected outputs on this page, so you can run your own checks.
Published verification sets
| Methods | Oracle | Fixtures | Tolerance | Date | File |
|---|---|---|---|---|---|
| primer-design-bounded-flanks, oligo-tm-nearest-neighbour | Biopython | 32 | Tm within 1e-6 degrees; retained qualifications, normalized requests and literal record claims exact | 2026-10-11 | primer-design-qualification-v2.json |
| primer-design-bounded-flanks | Biopython | 23 | asymmetric requested/retained correction agreement and historical records exact | 2026-10-11 | primer-qualification-effective-salt-v1.json |
| translation-ncbi-genetic-codes | Biopython | 113 | exact | 2026-10-06 | translation.json |
| orf-finder-ncbi-conventions | NCBI ORFfinder | 18 | exact, every field of every list | 2026-10-06 | orf.json |
| protein-average-mass, isoelectric-point-bjellqvist, extinction-280-pace | Expasy ProtParam | 22 | MW within 0.01 Da, pI within 0.01, ε280 exact | 2026-10-06 | protein.json |
| oligo-tm-nearest-neighbour, salt-correction-owczarzy-2004, salt-correction-owczarzy-2008, salt-correction-santalucia-1998 | Biopython | 45 | within 0.1 °C under both concentration models; regime, refusals and acceptance exact | 2026-10-06 | oligo-tm.json |
| hairpin-dimer-dg37 | primer3-py | 15 | within 0.4 kcal/mol on ntthal's own structures (8 cases here and 7 salt probes in hairpin-dimer-probes.json) | 2026-10-06 | hairpin-dimer.json |
| hairpin-dimer-dg37 | primer3-py | 16 | within 0.1 kcal/mol on ntthal's own structures (12 cases here and 4 salt probes in hairpin-dimer-probes.json) | 2026-10-06 | hairpin-dimer.json |
| nucleic-acid-average-mass | Python fractions | 5 | within 0.01 g/mol | 2026-10-06 | dna-mw.json |
| pcr-product-exact-pair | Exact-match derivation | 30 | exact, refusals included | 2026-10-10 | pcr-product.json |
| exact-fragment-search | Exact-match derivation | 26 | exact, refusals included | 2026-10-10 | fragment-search.json |
| primer-design-bounded-flanks | Primer-design derivation | 13 | every returned pair, coordinate, product, count and cap exact; Tm and ranking terms within 1e-6 °C; refusals exact | 2026-10-11 | primer-design.json |
| sdm-primers-two-schemes, oligo-tm-nearest-neighbour | Mutagenesis-primer derivation | 18 | every primer sequence, coordinate, matched flank, count by reason, cap and refusal exact; GC within 1e-9; every melting temperature within 1e-6 °C | 2026-10-17 | sdm-primers-v1.json |
| exact-transform-global-edit-v2 | Revision-transform derivation | 10 | kind, map, hashes, withheld state and annotation finding exact; edit count equals the independent edit distance | 2026-10-10 | revision-transforms.json |
| peptide-smiles-linear | RDKit | 101 | the same canonical SMILES on 89 peptides; the 12 refusals exact | 2026-10-06 | peptide-smiles.json |
Oracles and build-time tools
Software the app's numbers were checked against, or its data built with. None of it ships with the app or is a dependency of it.
- Biopython 1.88 (Biopython License Agreement (BSD-3-Clause file by file); Oracle; 2026-10-06). frame translations and the oligo Tm fixtures (MeltingTemp.Tm_NN with the named tables and corrections)
- Exact-match derivation exact_matches.py with Biopython 1.88 (MIT (the script); Biopython License Agreement (BSD-3-Clause file by file); Oracle; 2026-10-10). the PCR product and fragment search fixtures, every window tested directly, one case worked by hand
- Primer-design derivation primer_design.py with Biopython 1.88 (MIT (the script); Biopython License Agreement (BSD-3-Clause file by file); Oracle; 2026-10-11). the bounded primer-design fixtures: every melting temperature from MeltingTemp.Tm_NN, the candidate windows, counts, ranking and caps derived in the script, exact binding by the exact-match derivation, one case worked by hand
- Mutagenesis-primer derivation sdm_primers.py with Biopython 1.88 (MIT (the script); Biopython License Agreement (BSD-3-Clause file by file); Oracle; 2026-10-17). the site-directed mutagenesis primer fixtures: the mutant sequence, the candidate windows, the matched flanks, GC, the ranking and the counts by reason derived in the script, every melting temperature from MeltingTemp.Tm_NN and every reverse complement from Bio.Seq, one case per scheme worked by hand
- Revision-transform derivation revision-transforms.py with Biopython 1.88 (MIT (the script); Biopython License Agreement (BSD-3-Clause file by file); Oracle; 2026-10-10). the design-revision review fixtures: hand-worked coordinate maps and an independent edit distance
- primer3-py 2.3.1 (GPL-2.0-or-later; Oracle; 2026-10-06). hairpin, self-dimer and cross-dimer ΔG at 37 °C (libprimer3 2.6.1 thal, run offline as ntthal); never shipped and its parameter files never copied
- NCBI ORFfinder 0.4.3 (Public domain (NCBI); Oracle; 2026-10-06). cross-checking the ORF fixtures
- Expasy ProtParam web form, responses saved 2026-10-06 (SIB terms of use (To be checked); Oracle; 2026-10-06). molecular weight, isoelectric point and ε280 of 22 proteins and peptides
- RDKit 2026.03.6 (BSD-3-Clause; Oracle; 2026-10-06). the canonical SMILES of 89 peptides (MolFromSequence) for the molecule hand-off
- Python fractions 3.11.15 (Python-2.0; Oracle; 2026-10-06). exact arithmetic for the DNA molecular weight fixtures
Every row is one fixture compared with the engine when this page was built; the full sets are the published files, which pipeline/sequence-toolkit/reference.py, peptides.py and exact_matches.py wrote and whose hashes the manifest records. No value in a file comes from the engine under test.
Frame translations in genetic codes 1, 2 and 11
Expected values from Biopython 1.88 (Bio.Seq.translate), recorded 2026-10-06; tolerance exact; 12 of 108 shown, all passing. translation.json sha256 2f4debf7f26cdcf9…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| ins-mrna.t1.f+1.full | 155 aa, SPPGQAASEEAI… | 155 aa, SPPGQAASEEAI… | identical | yes |
| ins-mrna.t1.f+1.to_stop | 45 aa, SPPGQAASEEAI… | 45 aa, SPPGQAASEEAI… | identical | yes |
| ins-mrna.t1.f+2.full | 154 aa, ALQDRLHQKRPS… | 154 aa, ALQDRLHQKRPS… | identical | yes |
| ins-mrna.t1.f+2.to_stop | 38 aa, ALQDRLHQKRPS… | 38 aa, ALQDRLHQKRPS… | identical | yes |
| ins-mrna.t1.f+3.full | 154 aa, PSRTGCIRRGHQ… | 154 aa, PSRTGCIRRGHQ… | identical | yes |
| ins-mrna.t1.f+3.to_stop | 129 aa, PSRTGCIRRGHQ… | 129 aa, PSRTGCIRRGHQ… | identical | yes |
| ins-mrna.t1.f-1.full | 155 aa, AGSRALFHLSRC… | 155 aa, AGSRALFHLSRC… | identical | yes |
| ins-mrna.t1.f-1.to_stop | 147 aa, AGSRALFHLSRC… | 147 aa, AGSRALFHLSRC… | identical | yes |
| ins-mrna.t1.f-2.full | 154 aa, LVQGLYSISLGA… | 154 aa, LVQGLYSISLGA… | identical | yes |
| ins-mrna.t1.f-2.to_stop | 94 aa, LVQGLYSISLGA… | 94 aa, LVQGLYSISLGA… | identical | yes |
| ins-mrna.t1.f-3.full | 154 aa, WFKGFIPSLSVQ… | 154 aa, WFKGFIPSLSVQ… | identical | yes |
| ins-mrna.t1.f-3.to_stop | 24 aa, WFKGFIPSLSVQ… | 24 aa, WFKGFIPSLSVQ… | identical | yes |
Open reading frames, every list field by field
Expected values from an independent scan cross-checked with Biopython and NCBI ORFfinder 0.4.3, recorded 2026-10-06; tolerance exact; 12 of 18 shown, all passing. orf.json sha256 631f0a2853fe0219…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| ins-mrna.t1.atgOnly | 1 listed, 1 nested, 1 open | 1 listed, 1 nested, 1 open | every field equal | yes |
| ins-mrna.t1.alternativeStarts | 2 listed, 6 nested, 1 open | 2 listed, 6 nested, 1 open | every field equal | yes |
| ins-mrna.t2.atgOnly | 1 listed, 0 nested, 0 open | 1 listed, 0 nested, 0 open | every field equal | yes |
| ins-mrna.t2.alternativeStarts | 3 listed, 1 nested, 0 open | 3 listed, 1 nested, 0 open | every field equal | yes |
| ins-mrna.t11.atgOnly | 1 listed, 1 nested, 1 open | 1 listed, 1 nested, 1 open | every field equal | yes |
| ins-mrna.t11.alternativeStarts | 3 listed, 4 nested, 2 open | 3 listed, 4 nested, 2 open | every field equal | yes |
| mt-atp8-atp6-cox3.t1.atgOnly | 8 listed, 2 nested, 0 open | 8 listed, 2 nested, 0 open | every field equal | yes |
| mt-atp8-atp6-cox3.t1.alternativeStarts | 9 listed, 2 nested, 1 open | 9 listed, 2 nested, 1 open | every field equal | yes |
| mt-atp8-atp6-cox3.t2.atgOnly | 2 listed, 4 nested, 1 open | 2 listed, 4 nested, 1 open | every field equal | yes |
| mt-atp8-atp6-cox3.t2.alternativeStarts | 3 listed, 7 nested, 1 open | 3 listed, 7 nested, 1 open | every field equal | yes |
| mt-atp8-atp6-cox3.t11.atgOnly | 8 listed, 2 nested, 0 open | 8 listed, 2 nested, 0 open | every field equal | yes |
| mt-atp8-atp6-cox3.t11.alternativeStarts | 9 listed, 11 nested, 1 open | 9 listed, 11 nested, 1 open | every field equal | yes |
Molecular weight, pI and ε280 of 22 proteins and peptides
Expected values from Expasy ProtParam (saved responses), recorded 2026-10-06; tolerance MW within 0.01 Da, pI within 0.01, ε280 exact; 12 of 22 shown, all passing. protein.json sha256 de4163c56cf4b5d9…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| P01 Human preproinsulin (signal, B chain, C peptide, A chain) (110 aa) | 11980.91 Da, pI 5.22, ε 17335/16960 | 11980.91 Da, pI 5.22, ε 17335/16960 | MW -0.001, pI +0.00 | yes |
| P02 Aequorea victoria green fluorescent protein (238 aa) | 26886.32 Da, pI 5.67, ε 22015/21890 | 26886.32 Da, pI 5.67, ε 22015/21890 | MW +0.001, pI +0.00 | yes |
| P03 Human ubiquitin (first unit of polyubiquitin-C) (76 aa) | 8564.84 Da, pI 6.56, ε 1490/1490 | 8564.84 Da, pI 6.56, ε 1490/1490 | MW +0.005, pI +0.00 | yes |
| P04 Hen egg-white lysozyme C, mature chain (129 aa) | 14313.14 Da, pI 9.32, ε 37970/37470 | 14313.14 Da, pI 9.32, ε 37970/37470 | MW -0.001, pI +0.00 | yes |
| P05 Bovine serum albumin, mature chain (583 aa) | 66432.96 Da, pI 5.60, ε 42925/40800 | 66432.96 Da, pI 5.60, ε 42925/40800 | MW -0.005, pI +0.00 | yes |
| P06 Human metallothionein-2 (61 aa) | 6042.16 Da, pI 8.23, ε 1250/0 | 6042.16 Da, pI 8.23, ε 1250/0 | MW +0.005, pI +0.00 | yes |
| P07 Human thymosin beta-4, mature chain (43 aa) | 4921.46 Da, pI 5.02, ε 0/0 | 4921.46 Da, pI 5.02, ε 0/0 | MW +0.002, pI +0.00 | yes |
| P08 Human prothymosin alpha, N-terminally processed chain (110 aa) | 12071.77 Da, pI 3.66, ε 0/0 | 12071.77 Da, pI 3.66, ε 0/0 | MW -0.001, pI +0.00 | yes |
| P09 Human macrophage migration inhibitory factor, mature chain (114 aa) | 12345.11 Da, pI 8.24, ε 13075/12950 | 12345.11 Da, pI 8.24, ε 13075/12950 | MW -0.003, pI +0.00 | yes |
| P10 Human hemoglobin subunit alpha, mature chain (141 aa) | 15126.36 Da, pI 8.73, ε 9970/9970 | 15126.36 Da, pI 8.73, ε 9970/9970 | MW -0.004, pI +0.00 | yes |
| P11 Human myoglobin, mature chain (153 aa) | 17052.61 Da, pI 7.29, ε 13980/13980 | 17052.61 Da, pI 7.29, ε 13980/13980 | MW +0.004, pI +0.00 | yes |
| P12 Human cytochrome c, mature chain (104 aa) | 11617.53 Da, pI 9.59, ε 13075/12950 | 11617.53 Da, pI 9.59, ε 13075/12950 | MW +0.002, pI +0.00 | yes |
Oligo Tm under both concentration models
Expected values from Biopython 1.88 (MeltingTemp.Tm_NN), recorded 2026-10-06; tolerance within 0.1 °C; 12 of 45 shown, all passing. oligo-tm.json sha256 1588ca109f2e31df…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| T01 d15-at (50 mM Na⁺) | 31.08 / 28.66 °C | 31.08 / 28.66 °C | +0.000 / +0.000 | yes |
| T02 d15-gc (50 mM Na⁺) | 65.33 / 62.76 °C | 65.33 / 62.76 °C | +0.000 / +0.000 | yes |
| T03 M13F-20 (50 mM Na⁺) | 53.58 / 51.40 °C | 53.58 / 51.40 °C | +0.000 / +0.000 | yes |
| T04 T7-promoter (50 mM Na⁺) | 47.60 / 45.70 °C | 47.60 / 45.70 °C | +0.000 / +0.000 | yes |
| T05 T7-promoter (50 mM Na⁺) | 48.55 / 46.65 °C | 48.55 / 46.65 °C | +0.000 / +0.000 | yes |
| T06 T7-promoter (1000 mM Na⁺) | 63.95 / 61.86 °C | 63.95 / 61.86 °C | +0.000 / +0.000 | yes |
| T07 SP6 (50 mM Na⁺) | 42.77 / 40.68 °C | 42.77 / 40.68 °C | +0.000 / +0.000 | yes |
| T08 sc16 (50 mM Na⁺) | 55.14 / 53.97 °C | 55.14 / 53.97 °C | +0.000 / +0.000 | yes |
| T09 d30-at (1000 mM Na⁺) | 72.05 / 70.60 °C | 72.05 / 70.60 °C | -0.000 / -0.000 | yes |
| T10 d35 (50 mM Na⁺) | 76.60 / 75.43 °C | 76.60 / 75.43 °C | +0.000 / +0.000 | yes |
| T11 d40-at (50 mM Na⁺) | 51.96 / 51.00 °C | 51.96 / 51.00 °C | +0.000 / +0.000 | yes |
| T12 d40-gc (1000 mM Na⁺) | 99.98 / 98.88 °C | 99.98 / 98.88 °C | +0.000 / +0.000 | yes |
DNA molecular weight
Expected values from Python 3.11.15 fractions (hand arithmetic), recorded 2026-10-06; tolerance within 0.01 g/mol; 5 of 5 shown, all passing. dna-mw.json sha256 15f60ea1db40d55d…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| M01 dA (one nucleotide) | 251.246 g/mol | 251.246 g/mol | +0.0000 | yes |
| M02 T7 promoter primer | 6125.053 g/mol | 6125.053 g/mol | +0.0000 | yes |
| M03 M13 forward (-20) primer | 5228.467 g/mol | 5228.467 g/mol | +0.0000 | yes |
| M04 oligo(dT)20 | 6021.936 g/mol | 6021.936 g/mol | +0.0000 | yes |
| M05 designed 40-mer | 12320.042 g/mol | 12320.042 g/mol | +0.0000 | yes |
Predicted PCR products
Expected values from an independent derivation (exact_matches.py, Biopython 1.88), recorded 2026-10-10; tolerance exact; 12 of 30 shown, all passing. pcr-product.json sha256 dd145d143e6f6542…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| pcr-hand-unique | unique, 1 product(s), first 25 bp | unique, 1 product(s), first 25 bp | identical | yes |
| pcr-two-forward-sites | ambiguous, 2 product(s), first 37 bp | ambiguous, 2 product(s), first 37 bp | identical | yes |
| pcr-reverse-template | unique, 1 product(s), first 25 bp | unique, 1 product(s), first 25 bp | identical | yes |
| pcr-circular-origin | unique, 1 product(s), first 25 bp | unique, 1 product(s), first 25 bp | identical | yes |
| pcr-linear-no-wrap | none, 0 product(s) | none, 0 product(s) | identical | yes |
| pcr-site-across-origin | unique, 1 product(s), first 25 bp | unique, 1 product(s), first 25 bp | identical | yes |
| pcr-palindromic-pair | ambiguous, 2 product(s), first 22 bp | ambiguous, 2 product(s), first 22 bp | identical | yes |
| pcr-tails | unique, 1 product(s), first 41 bp | unique, 1 product(s), first 41 bp | identical | yes |
| pcr-tail-not-inferred | none, 0 product(s) | none, 0 product(s) | identical | yes |
| pcr-normalised-input | unique, 1 product(s), first 25 bp | unique, 1 product(s), first 25 bp | identical | yes |
| pcr-overlap-only | refused: overlapping-sites | refused: overlapping-sites | identical | yes |
| pcr-adjacent | unique, 1 product(s), first 20 bp | unique, 1 product(s), first 20 bp | identical | yes |
Exact fragment search
Expected values from an independent derivation (exact_matches.py, Biopython 1.88), recorded 2026-10-10; tolerance exact; 12 of 26 shown, all passing. fragment-search.json sha256 dffa9bebd1843720…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| frag-forward | 3-8 + | 3-8 + | identical | yes |
| frag-reverse | 3-8 - | 3-8 - | identical | yes |
| frag-palindrome-once | 3-8 both; 11-16 both | 3-8 both; 11-16 both | identical | yes |
| frag-homopolymer-overlaps | 2-5 +; 3-6 +; 4-7 +; 5-8 + | 2-5 +; 3-6 +; 4-7 +; 5-8 + | identical | yes |
| frag-homopolymer-reverse | 2-5 -; 3-6 -; 4-7 - | 2-5 -; 3-6 -; 4-7 - | identical | yes |
| frag-tandem-repeat | 1-8 +; 6-13 +; 11-18 + | 1-8 +; 6-13 +; 11-18 + | identical | yes |
| frag-iupac-barrier | 6-11 + | 6-11 + | identical | yes |
| frag-iupac-codes | 19-24 + | 19-24 + | identical | yes |
| frag-linear-no-wrap | no hit | no hit | identical | yes |
| frag-circular-origin | 7-4 + wraps | 7-4 + wraps | identical | yes |
| frag-circular-origin-reverse | 7-4 - wraps | 7-4 - wraps | identical | yes |
| frag-circular-full-length | 3-2 + wraps | 3-2 + wraps | identical | yes |
Peptides as SMILES
Expected values from RDKit 2026.03.6 (MolFromSequence), recorded 2026-10-06; tolerance the same canonical SMILES, each read back through RDKit.js; refusals exact; 12 of 101 shown, all passing. peptide-smiles.json sha256 4ca03c17768ce37a…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| N-A (3 residues) | C[C@H](N)C(=O)NCC(=O)N[C@@H](C)C(=O)O | C[C@H](N)C(=O)NCC(=O)N[C@@H](C)C(=O)O | the same canonical SMILES | yes |
| M-A (3 residues) | C[C@H](NC(=O)[C@H](C)NC(=O)CN)C(=O)O | C[C@H](NC(=O)[C@H](C)NC(=O)CN)C(=O)O | the same canonical SMILES | yes |
| C-A (3 residues) | C[C@H](NC(=O)[C@H](C)NC(=O)CN)C(=O)O | C[C@H](NC(=O)[C@H](C)NC(=O)CN)C(=O)O | the same canonical SMILES | yes |
| 1-A (1 residues) | C[C@H](N)C(=O)O | C[C@H](N)C(=O)O | the same canonical SMILES | yes |
| N-C (3 residues) | C[C@H](NC(=O)CNC(=O)[C@@H](N)CS)C(=O)O | C[C@H](NC(=O)CNC(=O)[C@@H](N)CS)C(=O)O | the same canonical SMILES | yes |
| M-C (3 residues) | C[C@H](NC(=O)[C@H](CS)NC(=O)CN)C(=O)O | C[C@H](NC(=O)[C@H](CS)NC(=O)CN)C(=O)O | the same canonical SMILES | yes |
| C-C (3 residues) | C[C@H](NC(=O)CN)C(=O)N[C@@H](CS)C(=O)O | C[C@H](NC(=O)CN)C(=O)N[C@@H](CS)C(=O)O | the same canonical SMILES | yes |
| 1-C (1 residues) | N[C@@H](CS)C(=O)O | N[C@@H](CS)C(=O)O | the same canonical SMILES | yes |
| N-D (3 residues) | C[C@H](NC(=O)CNC(=O)[C@@H](N)CC(=O)O)C(=… | C[C@H](NC(=O)CNC(=O)[C@@H](N)CC(=O)O)C(=… | the same canonical SMILES | yes |
| M-D (3 residues) | C[C@H](NC(=O)[C@H](CC(=O)O)NC(=O)CN)C(=O… | C[C@H](NC(=O)[C@H](CC(=O)O)NC(=O)CN)C(=O… | the same canonical SMILES | yes |
| C-D (3 residues) | C[C@H](NC(=O)CN)C(=O)N[C@@H](CC(=O)O)C(=… | C[C@H](NC(=O)CN)C(=O)N[C@@H](CC(=O)O)C(=… | the same canonical SMILES | yes |
| 1-D (1 residues) | N[C@@H](CC(=O)O)C(=O)O | N[C@@H](CC(=O)O)C(=O)O | the same canonical SMILES | yes |
Hairpins against the oracle, case by case
ntthal 2.6.1 (primer3-py 2.3.1), recorded 2026-10-06: 15 fixtures (15 in the gate), the oracle's own structure rescored under this engine's rules within 0.4 kcal/mol on every case with a structure and this engine's ΔG at or below that rescore; all passing. The two structures coincide on 6 of 13; the oracle reports the structure with the highest melting temperature, this engine the lowest ΔG°37. The badge reads the same numbers: within 0.4 kcal/mol, 15 fixtures.
| Case | Sequences | Oracle ΔG | Rescore of its structure | Gap and cause | Our ΔG | Our structure | Coincide | Pass |
|---|---|---|---|---|---|---|---|---|
| H01 hairpin | CCCCCATCCGATCAGGGGG | -3.18 | -2.99 | 0.19one salt step: the oracle counts one pair fewer for a stem reaching the oligo's end | -2.99 | /////---------\\\\\ | yes | yes |
| H02 hairpin | GCGCGAAAAAACGCGC | -4.79 | -4.42 | 0.37one salt step: the oracle counts one pair fewer for a stem reaching the oligo's end | -4.42 | /////------\\\\\ | yes | yes |
| H03 hairpin | ATATATTTTTTATATAT | none | none | yes | yes | |||
| H04 hairpin | ACTGCAGGCTTGCGATTTTCGCAAGCC | -9.21 | -8.99 | 0.21one salt step: the oracle counts one pair fewer for a stem reaching the oligo's end | -9.63 | ------////////-----\\\\\\\\ | no | yes |
| H05 hairpin | TTTTTTTTTTTTTTTTTTTT | none | none | yes | yes | |||
| H06 hairpin | GAATTTATTGAAAACAATAAATTC | -3.62 | -3.37 | 0.25one salt step: the oracle counts one pair fewer for a stem reaching the oligo's end | -5.25 | //////////----\\\\\\\\\\ | no | yes |
| H07 hairpin | GGATCCGAATTCGGATCC | -5.12 | -5.09 | 0.04 | -5.09 | ///////----\\\\\\\ | yes | yes |
| H08 hairpin | TTGACCGAGTGCAACGTACGGATCTGTTGCACTCGGTCAATGAC | -11.42 | -11.19 | 0.23the complementary-flank rule: the oracle keeps a single dangling end at a helix end | -14.36 | ///////////////----------\\\\\\\\\\\\\\\---- | no | yes |
| S01 hairpin | TTGACCGAGTGCAACGTACGGATCTGTTGCACTCGGTCAATGAC | -7.91 | -7.68 | 0.23the complementary-flank rule: the oracle keeps a single dangling end at a helix end | -9.89 | ///////////////----------\\\\\\\\\\\\\\\---- | no | yes |
| S02 hairpin | TTGACCGAGTGCAACGTACGGATCTGTTGCACTCGGTCAATGAC | -9.93 | -9.70 | 0.23the complementary-flank rule: the oracle keeps a single dangling end at a helix end | -12.46 | ///////////////----------\\\\\\\\\\\\\\\---- | no | yes |
| S03 hairpin | TTGACCGAGTGCAACGTACGGATCTGTTGCACTCGGTCAATGAC | -11.31 | -11.08 | 0.23the complementary-flank rule: the oracle keeps a single dangling end at a helix end | -14.22 | ///////////////----------\\\\\\\\\\\\\\\---- | no | yes |
| S04 hairpin | TTGACCGAGTGCAACGTACGGATCTGTTGCACTCGGTCAATGAC | -13.69 | -13.46 | 0.23the complementary-flank rule: the oracle keeps a single dangling end at a helix end | -17.25 | ///////////////----------\\\\\\\\\\\\\\\---- | no | yes |
| S09 hairpin | TGCGCGAAAAAACGCGCT | -5.31 | -5.32 | 0.02 | -5.32 | -/////------\\\\\- | yes | yes |
| S10 hairpin | GCGCGAAAAAACGCGC | -5.82 | -5.79 | 0.02 | -5.79 | /////------\\\\\ | yes | yes |
| S11 hairpin | TGCGCGAAAAAACGCGCT | -6.67 | -6.69 | 0.02 | -6.69 | -/////------\\\\\- | yes | yes |
Dimers against the oracle, case by case
ntthal 2.6.1 (primer3-py 2.3.1), recorded 2026-10-06: 16 fixtures (16 in the gate), the oracle's own structure rescored under this engine's rules within 0.1 kcal/mol on every case with a structure and this engine's ΔG at or below that rescore; all passing. The two structures coincide on 13 of 14; the oracle reports the structure with the highest melting temperature, this engine the lowest ΔG°37. The badge reads the same numbers: within 0.1 kcal/mol, 16 fixtures.
| Case | Sequences | Oracle ΔG | Rescore of its structure | Gap and cause | Our ΔG | Our structure | Coincide | Pass |
|---|---|---|---|---|---|---|---|---|
| D01 self-dimer | GCGAATTCGCATGCAAGCTT | -12.06 | -12.14 | 0.07 | -12.14 | ATGCAAGCTT GCGAATTCGC CGCTTAAGCG TTCGAACGTA ---------- | yes | yes |
| D02 self-dimer | TTGCCAGTCAAGTCAGCATGC | -6.45 | -6.42 | 0.04 | -6.42 | TTGCCAGTCAAGTCA --------------- GCATGC CGTACG ACTGAACTGACCGTT | yes | yes |
| D03 self-dimer | AAAAAAAAAAAAAAAAAAAA | none | none | yes | yes | |||
| D04 self-dimer | CTGACGTAAGCTTACGTCAG | -21.11 | -21.11 | 0.00 | -21.11 | CTGACGTAAGCTTACGTCAG GACTGCATTCGAATGCAGTC | yes | yes |
| D05 self-dimer | TAATACGACTCACTATAGGG | -3.80 | -3.76 | 0.05 | -3.76 | TAATACGACTCA GG---------- CTATAG GATATC GG ACTCAGCATAAT | yes | yes |
| D06 self-dimer | GGCCATTAGTCAGTACGGCC | -3.56 | -3.55 | 0.00 | -5.03 | ATTAGTCAGTACGGCC GGCC CCGG CCGGCATGACTGATTA ---------------- | no | yes |
| X01 cross-dimer | TAATACGACTCACTATAGGG / CCCTATAGTGAGTCGTATTA | -17.31 | -17.31 | 0.00 | -17.31 | TAATACGACTCACTATAGGG ATTATGCTGAGTGATATCCC | yes | yes |
| X02 cross-dimer | AGCTTGACCTGAAGGCATGC / TCAGTCCATGGATGGCATGC | -6.30 | -6.38 | 0.08 | -6.38 | AGCTTGACCTGAAG -------------- GCATGC CGTACG GTAGGTACCTGACT | yes | yes |
| X03 cross-dimer | AAAAAAAAAAAAAAAAAAAA / CCCCCCCCCCCCCCCCCCCC | none | none | yes | yes | |||
| X04 cross-dimer | GTAAAACGACGGCCAGT / CAGGAAACAGCTATGAC | -2.68 | -2.69 | 0.01 | -2.69 | GTAAAACGACGG AGT CC GG CAGTATCGACAAA AC- | yes | yes |
| X05 cross-dimer | CGCAAATGGGCGGTAGGCGTG / TAGAAGGCACAGTCGAGG | -2.71 | -2.73 | 0.02 | -2.73 | CGCAAA G GGTAGGCGTG TG GC AC CG GGAGCTG A GAAGAT---- | yes | yes |
| X06 cross-dimer | TAATACGACTCACTATAGGG / CCCTATAGTAAGTCGTATTA | -12.49 | -12.49 | 0.00 | -12.49 | C TAATACGACT ACTATAGGG ATTATGCTGA TGATATCCC A | yes | yes |
| S05 self-dimer | TTGCCAGTCAAGTCAGCATGC | -4.86 | -4.82 | 0.04 | -4.82 | TTGCCAGTCAAGTCA --------------- GCATGC CGTACG ACTGAACTGACCGTT | yes | yes |
| S06 self-dimer | TTGCCAGTCAAGTCAGCATGC | -5.78 | -5.74 | 0.04 | -5.74 | TTGCCAGTCAAGTCA --------------- GCATGC CGTACG ACTGAACTGACCGTT | yes | yes |
| S07 self-dimer | TTGCCAGTCAAGTCAGCATGC | -6.40 | -6.37 | 0.04 | -6.37 | TTGCCAGTCAAGTCA --------------- GCATGC CGTACG ACTGAACTGACCGTT | yes | yes |
| S08 self-dimer | TTGCCAGTCAAGTCAGCATGC | -7.49 | -7.45 | 0.04 | -7.45 | TTGCCAGTCAAGTCA --------------- GCATGC CGTACG ACTGAACTGACCGTT | yes | yes |
Security overview
Scientific computation runs in your browser, and individual apps need no account. Optional Bench accounts and backups use the site server and configured providers. The privacy statement, the hosts it contacts and the headers its workspace is served with are generated from its registry entry, the same record that sets the browser's policy.
What leaves your browser
What leaves your device. Requests for Drybench Sequence's own files (pages, scripts, data files and images) go to the host that serves it. That host keeps standard web-server logs (IP address, user agent, requested address, time). Anything in the address bar before the # (a search, a SMILES, an accession or a step) is sent to this site's host when a page loads or a link is opened; anything after the # is not sent. The submitted UniProt search text and selected accessions, not the separate pasted sequence go directly from your browser to the public services in the table below, exactly as if you used their websites; they see those identifiers and your IP address, under their own terms. The app carries no analytics and no error reporting, and loads no font or script from any other origin. Optional Bench sign-in and billing contact the site server and its configured account providers; choosing an account backup uploads the selected Study.
What stays on your device. Anything you save in the app, your preferences, and anything you have not chosen to export, share or back up to your account. They live in this browser's storage on this device.
Where you choose to send data. A link you copy carries what you were looking at (the sequence, the operation and the conditions you entered); anyone who receives it can read it, and mail and chat tools may fetch the link to show a preview. A file you export or share goes wherever you send it.
Hosts the app contacts
rest.uniprot.org
- Operator
- UniProt Consortium (EMBL-EBI, SIB and PIR)
- What for
- On Search UniProt, find protein records; on result selection, retrieve the full canonical sequence and source metadata.
- What it receives
- the search text submitted to UniProt and the selected accession; never the separate pasted sequence
- When
- on lookup
Headers the workspace is served with
These are the exact header values, generated from the app's registry entry.
- Content-Security-Policy
- default-src 'self'; script-src 'self' 'unsafe-inline'; worker-src 'self' blob:; connect-src 'self' https://rest.uniprot.org blob:; img-src 'self' data: blob:; style-src 'self' 'unsafe-inline'; font-src 'self'; object-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'
- Referrer-Policy
- no-referrer
- Permissions-Policy
- camera=(), microphone=(), geolocation=(), payment=(), usb=()
- X-Content-Type-Options
- nosniff
- Cross-Origin-Opener-Policy
- same-origin
Limits
- 1. For research and education only, and not medical advice: nothing here is an assessment of any person's variant, sample or molecule, and a difference reported from a reference is a difference, not an interpretation.
- 2. NCBI genetic codes 27, 28 and 31 contain context-dependent stop codons. Translation can show their amino-acid meaning, but stop-terminated translation and ORF detection are refused because the required biological context is not modelled.
- 3. Tm and structure calculations require finite, nonnegative ionic concentrations and a positive model-supported ionic strength. Zero ionic strength is refused rather than silently treated as a salt correction of zero.
- 4. pI, Tm and molecular weight depend on the method; the method and its parameter set are named on every card, and no alternative pK set is offered in this version.
- 5. Buffer conditions you type approximate a reaction buffer, not a vendor's calculator; use the vendor's calculator for its exact value, and treat the annealing temperature as the rule of thumb it is labelled.
- 6. Hairpin and dimer ΔG are two-state estimates at 37 °C from the SantaLucia and Hicks 2004 rules without the special triloop and tetraloop bonuses, so hairpins with GNA or GNRA loops are estimated less stable than they are.
- 7. Sequence operations run locally. Optional UniProt lookup sends the submitted query and selected accession to rest.uniprot.org, never the separate pasted sequence. The Verify at ProtParam and BLAST at NCBI links upload what you send, and say so; an optional Bench backup uploads the Study you choose.
- 8. Tags and protease sites are found by their published motifs and a cut is proposed at the site nearest an end; confirm it, since a motif inside the protein is not a cleavage site.
- 9. Inputs over 1 Mb are refused; six-frame, ORF and motif scans of inputs over 100 kb run in a Web Worker with progress and a Cancel. The primer check's near-match binding-site diagnostics are not run on templates of 100 kb or more.
- 10. Ambiguity codes are refused by name where a number cannot be computed from them (Tm, DNA molecular weight, hairpins and dimers) and kept where it can (reverse complement, translation to X, GC with S counted).
- 11. No offline use: the pages are served by the site, and nothing is installed.
- 12. A link keeps the inputs after the # of the address; it is not sent to a server, but it does stay in browser history and in any chat the link is pasted into.
- 13. Primer design is a bounded enumeration within the pasted template: candidate windows within the chosen flank of each target edge, kept inside the stated length, GC and Tm bounds, 24 windows a side and 24 pairs checked, 5 returned, and the search says when it is capped. A returned pair is a sequence design checked for one exact product in this template; it establishes no genome specificity, no mismatched binding and no amplification outcome, and no annealing temperature is chosen for it.
- 14. A sequence that arrives from another app is read with the alphabet its record states; residues without a stated alphabet are detected from their letters and the detection is shown.
- 15. The genetic code tables are NCBI's version 4.6 (gc.prt, last modified 10 June 2020); a table id travels with every translation.
Where it runs and what it sends
- Paste a sequenceType or paste it on an operation page or in the workbench, or open an example; the answer appears as you type and the link keeps what you pasted after the # of the address.
- Read every operationThe workbench shows the chosen operation first and the others folded beneath it, each with its settings, its copy button and its method chip.
- Keep it, send itA paste you pin, send or add to a study becomes a sequence object in this browser; a protein goes to the calculators for its A280, a short peptide to the molecule app as a structure, an accession to the protein app.
- Local calculations, optional lookupCalculations run locally, with inputs over 100 kb in a Web Worker that never fetches. Optional UniProt lookup sends only the search text and selected accession to rest.uniprot.org. The Verify at ProtParam and BLAST at NCBI links upload what you send, and say so.
Built for the keyboard and for screen readers
Everywhere in the app
- Show every keyboard shortcut
- ?
- Go to the search field
- /
- Open the command palette
- ControlK
- Open Settings
- Control,
- Close the innermost panel, menu or dialog
- Escape
In this app
- Go to reverse complement
- 1
- Go to translate
- 2
- Go to six frames
- 3
- Go to open reading frames
- 4
- Go to protein MW and pI
- 5
- Go to ε280
- 6
- Go to oligo Tm
- 7
- Go to primer check
- 8
- Go to GC percent
- 9
- Go to the paste box
- p
Single-key shortcuts work outside text fields and can be turned off in Settings.
Commitments
- Controls work from the keyboard, with focus always visible.
- One polite live region announces what changes, for screen readers.
- Reduced motion is honoured, from your system setting or the app's own switch.
- Works at 375 px wide.
Questions buyers ask
Why does the molecular weight differ from ProtParam's in the second decimal?
It should not: the default residue table is ProtParam's own, the same the protein and calculator apps use, and the 22 fixtures agree within 0.01 Da. The IUPAC CIAAW 2021 atomic weights give values a few hundredths of a dalton higher per hundred residues; that table sits behind a second id and the choice between the two is recorded for the founder's decision.
Which pK set does the isoelectric point use?
The Bjellqvist set as ProtParam applies it, including a C-terminal pK of 3.55 whatever the last residue, with bisection on the net charge over pH 0 to 14. The set was fitted between pH 4.5 and 7.3, so the pI of very acidic or very basic proteins is less certain; the card says so. No other set is offered in this version, so the method on every card is one named method.
Why are there two melting temperatures?
The concentration term in the nearest-neighbour equation depends on who is in excess. With the primer in excess over its template the term is the primer's concentration; with equal strands it is the total over four. The two differ by two to three degrees, which is why both are shown and the model is named on the chip.
How are hairpins and dimers checked against Primer3?
Primer3's ntthal is run offline as the oracle on 31 fixtures, and its own structures are rescored under this app's rules: within 0.4 kcal/mol for hairpins and 0.1 for dimers, every case, no exclusions. ntthal reports the structure with the highest melting temperature while this app reports the lowest ΔG at 37 °C, so the two can show different structures; the methods page lists every case. The special 3- and 4-base loop bonuses are not included, and the card says so.
Does the His tag change the numbers?
Yes: a His6 tag adds about 2,244 Da with its linker and shifts the pI, and the TEV site before it leaves a Ser or Gly on the product. The app finds the tag and the site by their motifs, proposes the cut at the site nearest an end, and shows MW, pI and ε280 as expressed and after the cut you confirm.
Is anything sent to a server?
Only when you ask: Search UniProt sends the search text to rest.uniprot.org, and selecting a result sends its accession to retrieve the full canonical sequence. The separate pasted sequence is not sent by lookup. Share links carry supported inputs after #; longer inputs remain in this browser. Optional Bench backup uploads the Study you choose. The Verify at ProtParam and BLAST at NCBI links leave the site and are labelled as uploads.
Can I design primers here?
Yes, within the template you paste: choose a target region and the constraints (length, Tm, GC, the pair's ΔTm, product size, excluded regions, optional 5′ tails), and the design page enumerates the candidate windows on each side of the target, ranks the pairs by three stated terms and checks each returned pair for one exact product in the template. The search is bounded and says when it is capped; a returned pair is a sequence design, not a prediction that it amplifies, and nothing is checked against a genome. The engine is this app's own, written from the stated constraints and checked against an independent derivation on published fixtures. Primer3's algorithms are GPL-2 and are not used in it; its program was run offline once as a recorded comparison, and its ntthal remains the oracle of the hairpin and dimer checks.
Next step
Want this tuned to your sequences?
Email m.beale@icloud.com with what you need, or use the contact page.