Docs and methods
Drybench Plasmid.
How the plasmid map turns a sequence into a map with library features, enzyme sites, methylation outcomes, primer sites, digests and bench numbers, what it lets you take away, how each method is checked against a named oracle, and what leaves your browser (only an accession you ask NCBI for).
Updated 6 October 2026 · v0.15.0
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
Paste a sequence, a FASTA or GenBank record, open a GenBank or SnapGene .dna file (read-only), start from pUC19 or pBR322, or fetch a public record from NCBI when you ask, and the plasmid is drawn as a circular or linear map: the parts the annotation library finds on either strand and across the origin, each with the alignment's identity, coverage, mismatches and gaps; the sites of 223 commercially available restriction enzymes with dam and dcm methylation as you set it; and the sites of the shipped sequencing primers.
The digest view gives the fragments of any digest and a schematic gel, and the picker finds the single and double digests whose bands tell the correct construct from one with the insert missing or reversed. The numbers view gives the plasmid's own double-stranded weight and the ng, pmol, copies per µL and ligation amounts that follow from it. A feature you add or edit is kept on the plasmid in this browser and travels in the GenBank file you export.
How it works
Annotation seeds every library part on both strands with shared 12-base words, clusters the seeds by diagonal and aligns each cluster locally with affine gaps in a band around it (Smith and Waterman with Gotoh's gaps; match +2, mismatch −3, gap open −5, gap extend −2). A match needs 99 percent identity and 95 percent coverage; a partial match 90 and 50 percent with at least 30 aligned bases; a part under 30 bases is called only when found whole and exact. A circle is searched extended by the longest part less one base, so a part across the origin is found once.
Restriction sites are found from each enzyme's IUPAC site on both strands and across the origin, with the cuts on each strand, Type IIS cuts outside the site and cuts that fall off the end of a linear molecule. Each site's dam and dcm marks are read against McClelland, Nelson and Raschke 1994, Table I: a site with no mark cuts; a mark on a base the table lists as not cut blocks it; marks on bases listed as cut leave it cutting; anything else reads "may be blocked" and is never counted as a cut. Everything runs in a Web Worker in your browser; the data files load from this site only once a sequence is open, and nothing is fetched from another host unless you ask for an NCBI record.
How it is checked
Every enzyme row was typed by hand and checked against Biopython's Bio.Restriction (an offline oracle) on pUC19 and pBR322; the 40 golden-set enzymes' pages were read by hand. The annotation engine agrees with Biopython's PairwiseAligner, with the same scoring, on 25 alignments of library parts to other NCBI records, within 0.1 percentage points of identity and coverage and with the same place, strand, call and score; synthetic inserts on each side of every threshold are called as the thresholds say, and random sequence and the golden plasmids reversed give no match. The bench numbers equal exact rational arithmetic, and the read-only .dna reader reads synthetic files built from NCBI records exactly as Biopython's reader does. The fixture files and their hashes are on the verification page.
Equations and defaults
- Feature calls
- match +2, mismatch −3, gap open −5, gap extend −2 (a gap of k bases scores −5 − 2(k − 1)). identity = identical columns / alignment columns (gaps included); coverage = the feature's aligned bases / its length. This app’s annotation-calling heuristics; match: identity ≥ 99 percent and coverage ≥ 95 percent; partial: identity ≥ 90 percent and coverage ≥ 50 percent, at least 30 aligned bases; under 30 bases only whole and exact. Seeds are shared 12-base words on either strand, clustered by diagonal; each cluster is aligned in a band of 16 bases plus 2 percent of the part's length. A part with no shared 12-base word is not seeded, which is why no call does not mean a part is absent. A partial match is drawn over its aligned bases only.
- Badge words
- Calling thresholds are This app’s annotation heuristics, not biological standards. Exact match at 100 percent identity and coverage; otherwise Match or Partial match with the identity, coverage, mismatches and gaps (gapped columns); a partial match adds truncated (under 95 percent of the library entry aligns), mutated (under 99 percent identical) or both. Identity and coverage are shown to one decimal, truncated toward zero, so a value shown never reaches a threshold the true value has not.
- Restriction sites
- Each enzyme's IUPAC site is searched on both strands, across the origin of a circle by extending the sequence by the site's length less one; each site is cut on the top and bottom strands at the row's stated offsets, so Type IIS enzymes cut outside their sites and a cut beyond the end of a linear molecule is reported as off the end.
- dam and dcm
- dam: G-m6A-TC on both strands; dcm: C-m5C-WGG on both strands; outcomes from McClelland et al. 1994, Table I, per base and strand. A site with no mark cuts; a mark on a base McClelland et al. (1994, Table I) record as not cut blocks it; marks only on bases recorded as cut leave it cutting; anything else, including slow, partial or conflicting entries and enzymes not in Table I, reads may be blocked and is never counted as a cut. Blocked by either methylation beats may be blocked, which beats cuts. This model calls DpnI cutting for fully methylated GATC only. DpnI can cleave hemimethylated sites much more slowly (NEB reports approximately 60-fold); that behaviour is not modelled.
- Counting and cutter lists
- A site count reads {n} sites: {c} cut, {b} blocked, {u} may be blocked. An enzyme with any site that may be blocked is listed apart, as depends on methylation, and is left out of the unique, two-cutter and no-cutter lists and of the picker.
- The digest picker
- The plasmid as given, with the marked insert removed (empty) and with it reversed: single digests of every enzyme that cuts the plasmid 1 to 6 times with no site that may be blocked, and pairs of them with at most 8 cuts together, are compared by their schematic bands. Two constructs are told apart when their band counts differ or a corresponding band differs by more than 5 percent; digests that tell all three apart come first, single enzymes before pairs, the clearest separation first.
- The schematic gel
- schematic: band order and log10(size) spacing; under 100 bp not drawn; sizes largest first, a fragment within 5 percent (inclusive, a judgement) of a band's largest fragment joins that band and may not resolve. A digest with one site that may be blocked draws two lanes, if it cuts and if blocked; with more than one such site no lane is drawn.
- Primer sites
- Exact and one-mismatch sites of the shipped primers on both strands and across the origin, sorted by position; a mismatch's place is counted from the primer's 3′ end (1 is the 3′-terminal base). The Tm is the primer's against a perfect match, from the sequence module (SantaLucia 1998 nearest-neighbour parameters, primer in excess at 250 nM, 50 mM Na⁺, no Mg²⁺), and is not given for a mismatched site.
- Bench numbers
- MW: both strands, residues as dNMP less water, CIAAW 2021 atomic weights; circular: no end groups; linear: 5′-OH ends. pmol = ng × 1000 / MW; copies = ng × 10⁻⁹ × N_A / MW (N_A = 6.02214076 × 10²³); insert ng = vector ng × (insert bp / vector bp) × ratio. The 650 Da per base pair rule is shown beside the exact weight as the approximation it is.
- Inputs
- Pasted letters, FASTA and GenBank records (the first record of a file), and SnapGene .dna files read-only by a reader of the public packet structure that knows the cookie, DNA, features, primers and notes packets and refuses any other, a truncated file, a declared length that disagrees with the sequence and an unknown format version. Up to 50,000 bp; IUPAC letters other than A, C, G and T are kept and never match a site.
Data sources, licences and versions
Sources and licences
NCBI GenBank nucleotide records
NCBI GenBank nucleotide recordsNo NCBI restrictions; depositor terms may applyThe annotation library's 90 parts, each cut from a feature its record's submitters annotated, with the accession, location and retrieval date; the pUC19 (L09137.2) and pBR322 (J01749.1) examples; the primers' binding-site checks; and the record you fetch by accession when you ask.
Records cited by accession and version; NCBI policies read 5 October 2026.
UniProt
UniProtCC BY 4.0The protein entries UniProt cross-references to the library's protein-coding parts, so a CDS opens in the protein app by accession.
The UniProt Consortium. UniProt: the Universal Protein Knowledgebase in 2025. Nucleic Acids Res 2025;53:D609-D617.
McClelland, Nelson and Raschke 1994 (dam and dcm sensitivity)
McClelland, Nelson and Raschke 1994 (dam and dcm sensitivity)Data (cited)Each enzyme's entries for N6-methyladenine (dam, GATC) and 5-methylcytosine (dcm, CCWGG) at each base and strand, with the page of Table I; an enzyme or base with no entry reads "may be blocked".
McClelland M, Nelson M, Raschke E. Effect of site-specific modification on restriction endonucleases and DNA modification methyltransferases. Nucleic Acids Res 1994;22(17):3640-3659, Table I (read 6 October 2026).
The enzyme table (recognition sites and cuts as published facts)
The enzyme table (recognition sites and cuts as published facts)Our own content223 commercially available enzymes in common use, typed by hand, each with its recognition site, its cut on each strand and a link to the enzyme's public page; isoschizomers kept where the cut or the methylation sensitivity differs.
Enzyme table version 1, built 2026-10-06.
Smith and Waterman 1981; Gotoh 1982 (local alignment with affine gaps)
Smith and Waterman 1981; Gotoh 1982 (local alignment with affine gaps)Method (cited)The local alignment behind every feature call, with the scoring stated on the methods page.
Smith TF, Waterman MS. Identification of common molecular subsequences. J Mol Biol 1981;147:195-197. Gotoh O. An improved algorithm for matching biological sequences. J Mol Biol 1982;162:705-708.
Vector makers' manuals (sequencing primer names)
Vector makers' manuals (sequencing primer names)Data (cited)The name of each shipped primer, exactly as its maker's manual gives it: Thermo Fisher Scientific's TOPO TA Cloning Kit (MAN0000047), pcDNA3.1 (version K) and pcDNA3.4-TOPO TA (MAN0007209) user guides, and Promega's pGEM-T and pGEM-T Easy Vector Systems manual (TM042); no text copied.
Read 6 October 2026. Each primer is also found exactly at a binding site in an NCBI record.
Geier and Modrich 1979 (DpnI)
Geier and Modrich 1979 (DpnI)Method (cited)DpnI's blunt cut, GA^TC, 3′ of the methylated adenine, beside McClelland 1994's entry that it cuts only GATC methylated on both strands.
Geier GE, Modrich P. Recognition sequence of the dam methylase of Escherichia coli K12 and mode of cleavage of Dpn I endonuclease. J Biol Chem 1979;254(4):1408-1413 (abstract read 6 October 2026).
DNA ladder product sheets (band sizes)
DNA ladder product sheets (band sizes)Data (cited); use to be checkedEach ladder's band sizes, typed by hand from its supplier's product sheet; drawn as listed, never used to size or match a band.
Sheets MAN0013004 and MAN0013047, Rev. D.00, read 17 October 2026.
The plasmid map's fixtures
The plasmid map's fixturesMITThe oracle values the engine is checked against, the synthetic .dna files and the hand-worked methylation cases, written by the pipeline's scripts.
pipeline/plasmid-map/reference.py and make-dna-fixtures.py (the suite's authors, 6 October 2026).
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 features, the enzyme sites, the digest's fragments, the primer sites and the numbers as CSV with the provenance sidecar; the map and the schematic gel as SVG or PNG with the provenance embedded; a printed page with the map, the feature table and the digest; the plasmid as a GenBank file with every feature, and as FASTA. A GenBank file written here is never presented as an NCBI record: its ACCESSION and VERSION lines are a single full stop, the source record is named in its COMMENT, each feature the library found carries /provenance="library" with the library version, the badge and the licence in its /note, and a feature you added or edited carries /provenance="added" or "edited" and none of the source's identifiers.
CSV columns
- Features
- name, type, start, end, strand, length_bp; call (Exact match, Match, Partial match or empty for a feature that is not a library call); identity_pct and coverage_pct to four decimals, truncated; identical, columns, mismatches, gaps (gapped columns), gloss and aligned_bases; local_alignment_score, the local alignment's score under the scheme in the methods (match +2, mismatch −3, gap open −5, gap extend −2; a gap of k bases scores −5 − 2(k − 1)), for re-deriving a call and never a quality measure: for a feature under 30 bases no alignment runs and it is set to twice the length; provenance (library, record, file, added or edited); source_accession, source_location, licence; and uniprot, the accession only when the call carries it (a full-length match whose translation is identical to the entry's canonical sequence).
- Enzyme sites
- enzyme, site, position (the site's first base), strand, cut_after_top, cut_after_bottom; cut_call (cuts, blocked or unknown); methylation (none, blocked, not-blocked, not-recorded or needs-methylation); methylase (dam, dcm or both); host_methylation, one of the tokens dam-dcm (E. coli, dam positive and dcm positive), dam (dam positive, dcm negative), dcm (dam negative, dcm positive), none (dam negative, dcm negative) or unmethylated (a PCR product or synthetic DNA); methylation_source.
- Fragments
- size_bp, from, to, left_enzyme, right_enzyme, and variant (if it cuts or if blocked, where one site may be blocked); the host is in the provenance.
- Primer sites
- primer, position, end, strand, mismatches, mismatch_from_3prime (1 is the 3′-terminal base; empty at an exact site), tm_c (empty at a mismatched site).
- Numbers
- quantity, value, unit and formula, each row as shown.
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/digest.test.ts
- Every enzyme row against Biopython 1.88 Bio.Restriction (its data are REBASE release 404, an offline oracle only): 223 enzymes on pUC19 and pBR322 (446 cases), cut positions exact, the 40 golden-set counts against the enzymes' pages read by hand, 6 double digests, the sites across the origin, Type IIS cuts off the end of a line, and the picker's pool and verdicts on the correct, empty and reversed trio.
- src/lib/seq/methylation.test.ts
- 19 cases worked by hand from McClelland et al. 1994, Table I, and the cited blocked examples on pUC19 and pBR322; the reasons by category; blocked beats may be blocked.
- src/lib/seq/features/annotate.test.ts
- 26 alignments against Biopython's PairwiseAligner (identity and coverage within 0.1 percentage points; place, strand, call and score exact), 12 synthetic boundary cases, and the specificity test: no match and 0 partial calls on 10 seeded random sequences of 10,000 bp and both golden plasmids reversed.
- src/lib/seq/features/primers.test.ts and snapgene.test.ts
- Each shipped primer at its NCBI binding site; one-mismatch places on both strands and across the origin. The .dna reader against Biopython's SnapGene reader on 6 synthetic files built from NCBI records, every feature recovered, and 4 refusal files refused for their stated reasons. Real SnapGene files are checked only at the pre-live pass.
- src/lib/seq/dna-amounts.test.ts
- 11 cases against exact rational arithmetic, to full double precision.
- src/components/tools/plasmid-map/genbank-export.test.ts
- The GenBank export read back by Biopython 1.88: ACCESSION '.', /provenance kept, no identifier on a feature you added or edited, every /note ASCII, and every CDS's /translation equal to Biopython's or left out where Biopython refuses it.
- src/lib/seq/plasmid-examples.test.ts
- The worked examples' golden fixtures, written once by the oracle: every call, the UniProt check of each linked CDS call, every primer site and every enzyme's cut count on pUC19 and pBR322.
- pipeline/plasmid-map/reference.py and make-dna-fixtures.py
- The oracle script (Python 3.11, Biopython 1.88) and the build-time .dna writer, MIT; the fixtures' hashes are in fixtures/manifest.json, and the writer is never imported by the app.
Every row is one fixture compared with the engine when this page was built; the full sets are the published files, which pipeline/plasmid-map/reference.py wrote and whose hashes its manifest records. No value in a file comes from the engine under test.
Every enzyme's cut positions and fragments on pUC19 and pBR322, and the double digests
Biopython 1.88 Bio.Restriction (REBASE release 404, an offline oracle); tolerance: exact. 458 cases, all passing; the first 12 shown. digests.json sha256 4b39c25d5bb5f091
Uses no annotation library.
| Case | Oracle | This engine | Pass |
|---|---|---|---|
| AarI on L09137.2 | no site | no site | yes |
| AarI on J01749.1 | no site | no site | yes |
| AatII on L09137.2 | cuts after 2,622 | cuts after 2,622 | yes |
| AatII on J01749.1 | cuts after 4,289 | cuts after 4,289 | yes |
| AbsI on L09137.2 | no site | no site | yes |
| AbsI on J01749.1 | no site | no site | yes |
| Acc65I on L09137.2 | cuts after 409 | cuts after 409 | yes |
| Acc65I on J01749.1 | no site | no site | yes |
| AccI on L09137.2 | cuts after 431 | cuts after 431 | yes |
| AccI on J01749.1 | cuts after 653, 2,246 | cuts after 653, 2,246 | yes |
| AciI on L09137.2 | cuts after 76, 115, 125, 151, 189, 202, 228, 285, 497, 600, 656, 666, 690, 733, 740, 761, 852, 880, 1,007, 1,026, 1,147, 1,257, 1,392, 1,401, 1,763, 1,854, 2,045, 2,091, 2,212, 2,256, 2,333, 2,442, 2,541, 2,588 | cuts after 76, 115, 125, 151, 189, 202, 228, 285, 497, 600, 656, 666, 690, 733, 740, 761, 852, 880, 1,007, 1,026, 1,147, 1,257, 1,392, 1,401, 1,763, 1,854, 2,045, 2,091, 2,212, 2,256, 2,333, 2,442, 2,541, 2,588 | yes |
| AciI on J01749.1 | cuts after 40, 182, 290, 299, 302, 426, 579, 582, 585, 704, 724, 803, 843, 892, 939, 1,024, 1,039, 1,107, 1,140, 1,165, 1,210, 1,234, 1,246, 1,288, 1,342, 1,395, 1,411, 1,417, 1,498, 1,636, 1,765, 1,768, 1,779, 1,935, 1,951, 2,006, 2,062, 2,147, 2,186, 2,196, 2,238, 2,263, 2,301, 2,314, 2,340, 2,357, 2,400, 2,407, 2,428, 2,519, 2,547, 2,674, 2,693, 2,814, 2,924, 3,059, 3,068, 3,430, 3,521, 3,712, 3,758, 3,879, 3,923, 4,000, 4,109, 4,208, 4,255 | cuts after 40, 182, 290, 299, 302, 426, 579, 582, 585, 704, 724, 803, 843, 892, 939, 1,024, 1,039, 1,107, 1,140, 1,165, 1,210, 1,234, 1,246, 1,288, 1,342, 1,395, 1,411, 1,417, 1,498, 1,636, 1,765, 1,768, 1,779, 1,935, 1,951, 2,006, 2,062, 2,147, 2,186, 2,196, 2,238, 2,263, 2,301, 2,314, 2,340, 2,357, 2,400, 2,407, 2,428, 2,519, 2,547, 2,674, 2,693, 2,814, 2,924, 3,059, 3,068, 3,430, 3,521, 3,712, 3,758, 3,879, 3,923, 4,000, 4,109, 4,208, 4,255 | yes |
dam and dcm outcomes, worked by hand
McClelland et al. 1994, Table I; tolerance: exact. 19 cases, all passing; the first 12 shown. methylation.json sha256 3b72a819ada98d26
Uses no annotation library.
| Case | Oracle | This engine | Pass |
|---|---|---|---|
| M01: XbaI, dam on, dcm on | cut | cut | yes |
| M02: XbaI, dam on, dcm on | blocked | blocked | yes |
| M03: XbaI, dam on, dcm on | blocked | blocked | yes |
| M04: BamHI, dam on, dcm on | not-blocked | not-blocked | yes |
| M05: BsaWI, dam on, dcm on | not-recorded | not-recorded | yes |
| M06: AhdI, dam on, dcm on | not-recorded | not-recorded | yes |
| M07: EcoRII, dam on, dcm on | blocked | blocked | yes |
| M08: BstNI, dam on, dcm on | not-blocked | not-blocked | yes |
| M09: StuI, dam on, dcm on | blocked | blocked | yes |
| M10: XbaI, dam on, dcm on | blocked | blocked | yes |
| M11: BglI, dam on, dcm on | not-recorded | not-recorded | yes |
| M12: DpnI, dam on, dcm on | cuts-methylated | cuts-methylated | yes |
The digest picker on the correct, empty and reversed trio (trio v2, gel rules 2)
Biopython 1.88 Bio.Restriction; tolerance: the pool, every band and every verdict exact. 4,158 cases, all passing; the first 12 shown. trio-v2.json sha256 fd62948a014229b7
Uses no annotation library.
| Case | Oracle | This engine | Pass |
|---|---|---|---|
| the constructs and the pool | 95 enzymes; the constructs' SHA-256 | 95 enzymes; the same constructs | yes |
| AatII | does not | does not | yes |
| Acc65I | does not | does not | yes |
| AccI | does not | does not | yes |
| AclI | does not | does not | yes |
| AcuI | tells all three apart | tells all three apart | yes |
| AflIII | does not | does not | yes |
| AhdI | does not | does not | yes |
| AlwNI | does not | does not | yes |
| ApaLI | does not | does not | yes |
| ApoI | does not | does not | yes |
| AseI | does not | does not | yes |
Band grouping on the schematic gel, worked by hand
Hand-worked cases with exact fractions; tolerance: every band exact; the 5 percent boundary inclusive. 11 cases, all passing; the first 11 shown. gel-bands-v1.json sha256 565950590c2bf04a
Uses no annotation library.
| Case | Oracle | This engine | Pass |
|---|---|---|---|
| chain-1000-960-922: 1000, 960, 922 bp | [1000, 960] [922] | [1000, 960] [922] | yes |
| boundary-inclusive: 1000, 950 bp | [1000, 950] | [1000, 950] | yes |
| boundary-just-over: 1000, 949 bp | [1000] [949] | [1000] [949] | yes |
| four-member-run: 2000, 1980, 1950, 1900 bp | [2000, 1980, 1950, 1900] | [2000, 1980, 1950, 1900] | yes |
| long-run-splits: 2000, 1960, 1920, 1880, 1840 bp | [2000, 1960, 1920] [1880, 1840] | [2000, 1960, 1920] [1880, 1840] | yes |
| under-100-not-drawn: 3000, 100, 99, 60 bp | [3000] [100] | [3000] [100] | yes |
| near-100: 105, 100 bp | [105, 100] | [105, 100] | yes |
| equal-sizes: 500, 500, 500 bp | [500, 500, 500] | [500, 500, 500] | yes |
| equal-then-boundary: 1000, 1000, 950, 949 bp | [1000, 1000, 950] [949] | [1000, 1000, 950] [949] | yes |
| unsorted-input: 922, 1000, 960 bp | [1000, 960] [922] | [1000, 960] [922] | yes |
| all-under-100: 99, 50, 10 bp | no band | no band | yes |
Feature alignments and threshold boundaries
Biopython 1.88 PairwiseAligner; tolerance: identity and coverage within 0.1 percentage points; place, call and score exact. 26 cases, all passing; the first 12 shown. features.json sha256 a523a03a76efcc1a
Checked against annotation library 1.
| Case | Oracle | This engine | Pass |
|---|---|---|---|
| F01: bla on X65304.3 | match, 99.77% identity, 100.00% coverage at 1265 | match, 99.77% identity, 100.00% coverage at 1265 | yes |
| F02: bla on U47120.2 | match, 99.77% identity, 100.00% coverage at 3780 | match, 99.77% identity, 100.00% coverage at 3780 | yes |
| F03: bla on AF025843.2 | match, 99.77% identity, 100.00% coverage at 2393 | match, 99.77% identity, 100.00% coverage at 2393 | yes |
| F04: bla on U13853.1 | match, 100.00% identity, 100.00% coverage at 1377 | match, 100.00% identity, 100.00% coverage at 1377 | yes |
| F05: nptII on U55762.1 | match, 99.75% identity, 100.00% coverage at 2629 | match, 99.75% identity, 100.00% coverage at 2629 | yes |
| F06: nptII on U47120.2 | match, 100.00% identity, 100.00% coverage at 2463 | match, 100.00% identity, 100.00% coverage at 2463 | yes |
| F07: nptII on AY048743.1 | match, 100.00% identity, 100.00% coverage at 459 | match, 100.00% identity, 100.00% coverage at 459 | yes |
| F08: cat on LC760188.1 | match, 100.00% identity, 100.00% coverage at 3344 | match, 100.00% identity, 100.00% coverage at 3344 | yes |
| F09: lacI on U13853.1 | match, 99.91% identity, 100.00% coverage at 3318 | match, 99.91% identity, 100.00% coverage at 3318 | yes |
| F10: egfp on U55763.1 | match, 100.00% identity, 99.72% coverage at 613 | match, 100.00% identity, 99.72% coverage at 613 | yes |
| F11: cmvEnhancer on AF025843.2 | match, 99.85% identity, 99.85% coverage at 7 | match, 99.85% identity, 99.85% coverage at 7 | yes |
| F12: cmvPromoter on AF025843.2 | match, 100.00% identity, 100.00% coverage at 667 | match, 100.00% identity, 100.00% coverage at 667 | yes |
ng, pmol, copies, ligation and the weights
Python fractions (exact arithmetic); tolerance: 1e-12 relative. 11 cases, all passing; the first 11 shown. amounts.json sha256 b796d93baed8c741
Uses no annotation library.
| Case | Oracle | This engine | Pass |
|---|---|---|---|
| A01: pmol | 0.6025208835093896 | 0.6025208835093896 | yes |
| A02: pmol | 0.18554121286562347 | 0.18554121286562347 | yes |
| A03: copies-per-ul | 3628465571.333107 | 3628465571.333107 | yes |
| A04: copies-per-ul | 223471060.13158152 | 223471060.13158152 | yes |
| A05: ligation-insert-ng | 40.20848845867461 | 40.20848845867461 | yes |
| A06: ligation-insert-ng | 26.805658972449738 | 26.80565897244974 | yes |
| A07: ligation-insert-ng | 57.32630130703967 | 57.32630130703967 | yes |
| A08: pmol-approximate | 0.5727704908643106 | 0.5727704908643106 | yes |
| A09: ng-for-copies | 27.559859128898875 | 27.559859128898875 | yes |
| A10: mw | 1659693.51 | 1659693.51 | yes |
| A11: mw | 2694819.077 | 2694819.077 | yes |
Synthetic .dna files and refusals
Biopython 1.88 SnapGene reader; tolerance: sequence and topology identical; every feature recovered; refusals for the stated reason. 10 cases, all passing; the first 10 shown. dna-files.json sha256 74f5f2b35995cb89
Uses no annotation library.
| Case | Oracle | This engine | Pass |
|---|---|---|---|
| dna/refuse-length-mismatch.dna | refused: length-mismatch | refused: length-mismatch | yes |
| dna/refuse-truncated.dna | refused: truncated | refused: truncated | yes |
| dna/refuse-unknown-packet.dna | refused: unknown-packet | refused: unknown-packet | yes |
| dna/refuse-unknown-version.dna | refused: unknown-version | refused: unknown-version | yes |
| dna/synthetic-2micron-origin.dna | 6318 bp circular; 40 features | 6318 bp circular; 40 of 40 recovered | yes |
| dna/synthetic-lac-linear.dna | 7477 bp linear; 15 features | 7477 bp linear; 15 of 15 recovered | yes |
| dna/synthetic-pbr322.dna | 4361 bp circular; 46 features | 4361 bp circular; 46 of 46 recovered | yes |
| dna/synthetic-pcineo.dna | 5472 bp circular; 13 features | 5472 bp circular; 13 of 13 recovered | yes |
| dna/synthetic-pgem3z-origin.dna | 2743 bp circular; 13 features | 2743 bp circular; 13 of 13 recovered | yes |
| dna/synthetic-puc19-linear.dna | 2686 bp linear; 0 features | 2686 bp linear; 0 of 0 recovered | yes |
The GenBank export read back
Biopython 1.88 GenBank parser; tolerance: translations equal or refused alike; ACCESSION '.'; no identifier on a person's feature. 11 cases, all passing; the first 11 shown. genbank.json sha256 da83de6798455d21
Uses no annotation library.
| Case | Oracle | This engine | Pass |
|---|---|---|---|
| pbr322-edits CDS 1 (edited) | Biopython refuses | none written (Final codon 'ATG' is not a stop codon) | yes |
| pbr322-edits CDS 2 (library) | Biopython's translation | /translation written | yes |
| pbr322-edits CDS 3 (edited) | Biopython's translation | /translation written | yes |
| pbr322-edits CDS 4 (as received) | Biopython's translation | /translation written | yes |
| pbr322-edits CDS 5 (added) | Biopython refuses | none written (First codon 'ACC' is not a start codon) | yes |
| pbr322-edits CDS 6 (library) | Biopython's translation | /translation written | yes |
| pbr322-edits CDS 7 (as received) | Biopython's translation | /translation written | yes |
| puc19-edits misc_feature 1 (added) | ASCII notes, no identifier | ASCII notes, no identifier | yes |
| puc19-edits CDS 2 (edited) | Biopython's translation | /translation written | yes |
| puc19-edits CDS 3 (added) | Biopython refuses | none written (First codon 'GAG' is not a start codon) | yes |
| puc19-edits CDS 4 (added) | Biopython refuses | none written (Final codon 'TGG' is not a stop codon) | yes |
The worked examples' golden fixtures (every file the examples manifest lists, published beside it)
Biopython 1.88; tolerance: exact. 12 cases, all passing; the first 12 shown. examples-manifest.json sha256 9ad77b5d2e896d76
Each file is checked against its own annotation library: library 1 for puc19@1.json and pbr322@1.json; library 2 for puc19@2.json and pbr322@2.json.
| Case | Oracle | This engine | Pass |
|---|---|---|---|
| puc19@1.json: calls and UniProt checks | 6 calls | 6 calls | yes |
| puc19@1.json: primer sites | 4 | 4 | yes |
| puc19@1.json: cut counts | 223 enzymes | 223 agree | yes |
| pbr322@1.json: calls and UniProt checks | 4 calls | 4 calls | yes |
| pbr322@1.json: primer sites | 0 | 0 | yes |
| pbr322@1.json: cut counts | 223 enzymes | 223 agree | yes |
| puc19@2.json: calls and UniProt checks | 7 calls | 7 calls | yes |
| puc19@2.json: primer sites | 4 | 4 | yes |
| puc19@2.json: cut counts | 223 enzymes | 223 agree | yes |
| pbr322@2.json: calls and UniProt checks | 5 calls | 5 calls | yes |
| pbr322@2.json: primer sites | 0 | 0 | yes |
| pbr322@2.json: cut counts | 223 enzymes | 223 agree | yes |
Published verification sets
| Methods | Oracle | Fixtures | Tolerance | Date | File |
|---|---|---|---|---|---|
| sequence-primer-features | Independent Sequence handoff | 43 | full incorporated PCR primers, exact witnessed template sites, wrapped strands, refusal and omission counts exact; supplied annotations preserved | 2026-10-11 | sequence-handoff-v1.json |
| ds-fragment-ends, restriction-cloning, golden-gate | Biopython | 67 | strand chemistry and paired cores exact; circular products identical up to rotation and strand; overlapping cuts refused | 2026-10-11 | assembly-boundaries.json |
| ds-fragment-ends, restriction-cloning | Biopython | 1 | coincident top cuts with distinct opposite-strand cuts refused | 2026-10-11 | assembly-cut-refusals-v1.json |
| assembly-record | Independent assembly records | 10 | shape, exact hashes, topology, parent references and method-specific accounting; malformed provenance refused, stale provenance dropped with reason | 2026-10-11 | assembly-record-v2.json |
| assembly-record | Independent assembly records | 19 | exact input/junction totals, parent roles, junction counts and method-specific alternatives; balanced false claims refused | 2026-10-11 | assembly-record-refusals-v1.json |
| restriction-sites, restriction-digest | Biopython | 446 | cut positions and fragment lengths exact; the unique-cutter sets identical | 2026-10-06 | digests.json |
| dam-dcm-blocking | McClelland et al. 1994, Table I | 21 | outcomes exact | 2026-10-06 | methylation.json |
| diagnostic-digest-picker | Biopython | 4157 | the pool, bands and verdicts exact (gel rules 2) | 2026-10-17 | trio-v2.json |
| gel-schematic | Hand-worked band grouping | 11 | bands exact | 2026-10-17 | gel-bands-v1.json |
| feature-annotation | Biopython | 38 | identity and coverage within 0.1 percentage points; place, strand, call and score exact | 2026-10-06 | features.json |
| feature-annotation | Biopython | 4017 | every pair of library 2's parts aligned with the same scoring: calls, places, strands and buckets exact; no call on the random controls | 2026-10-17 | specificity-v2.json |
| feature-annotation | Biopython | 14 | the call shown at each locus, the parts named beside it and the inside labels exact | 2026-10-17 | specificity-display.json |
| dam-dcm-blocking | Independent second implementation (reference.py can_carry) | 82 | which enzymes' sites can carry a dam or dcm methylated base, exact; whether Table I lists the enzymes without a row is not checked | 2026-10-17 | methylation-absence-rule.json |
| plasmid-dna-amounts | Python fractions | 11 | full double precision (1e-12 relative) | 2026-10-06 | amounts.json |
| snapgene-read | Biopython | 10 | sequence and topology identical; every feature recovered; refusals for the stated reason | 2026-10-06 | dna-files.json |
| ds-fragment-ends | Hand-worked double-stranded ends | 13 | every overhang, polarity and compatibility verdict exact | 2026-10-10 | ds-ends.json |
| restriction-cloning | Hand-worked restriction clones | 5 | every product exact up to rotation and strand; refusals for the stated reason; material conserved | 2026-10-10 | restriction-cloning.json |
| golden-gate | Hand-worked Golden Gate assemblies | 7 | the scarless product exact up to rotation and strand, no recognition site surviving; refusals for the stated reason | 2026-10-10 | golden-gate.json |
| gibson-style | Hand-worked Gibson assemblies | 7 | the product exact (a circle up to rotation and strand), each overlap collapsed once, material conserved; refusals for the stated reason | 2026-10-10 | gibson.json |
| crispr-spcas9-guides | Independent SpCas9 enumeration | 21 | every position, strand, protospacer, PAM, GC, homopolymer run, within-sequence count and origin crossing exact; no score | 2026-10-10 | crispr.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.
- Independent Sequence handoff sequence-handoff.py with Biopython 1.88 (MIT (script); Biopython License Agreement; Oracle; 2026-10-11). independently re-extracted product and template footprints, paired omissions, immutable qualifications and malformed receipt refusals
- Independent assembly records assembly-boundaries.py (MIT; Oracle; 2026-10-11). hand-authored record cases based on previously published independent products, with Python hashlib hashes and method-specific conservation
- Biopython 1.88 (Biopython Licence Agreement or BSD-3-Clause; Oracle; 2026-10-06). Bio.Restriction to check every enzyme row and cut position, PairwiseAligner for the feature alignments, and the SnapGene reader for the synthetic .dna files; never shipped
- Independent second implementation (reference.py can_carry) reference.py absences (MIT; Oracle; 2026-10-17). which enzymes' sites can carry a dam or dcm methylated base, by expanding each site's IUPAC codes; shares no code with the engine and calls no Biopython
- Python fractions 3.11 (PSF-2.0; Oracle; 2026-10-06). exact arithmetic for the bench numbers
- Hand-worked band grouping reference.py gel (MIT; Oracle; 2026-10-17). band-grouping cases worked by hand with exact fractions
- McClelland et al. 1994, Table I Nucleic Acids Res 22:3640 (Cited data (read by hand); Oracle; 2026-10-06). the methylation outcomes, each case worked by hand from the table's entries
- Hand-worked double-stranded ends ds-ends.py with Biopython 1.88 (MIT (the script); Biopython Licence Agreement (BSD-3-Clause file by file); Oracle; 2026-10-10). the overhang, polarity and compatibility of restriction ends, each case worked by hand and re-derived from a two-strand drawing
- Hand-worked restriction clones restriction-cloning.py with Biopython 1.88 (MIT (the script); Biopython Licence Agreement (BSD-3-Clause file by file); Oracle; 2026-10-10). recombinant products worked out by hand and round-tripped by Bio.Restriction, which digests each product back into the insert and backbone cores; reverse complements by Biopython
- Hand-worked Golden Gate assemblies golden-gate.py with Biopython 1.88 (MIT (the script); Biopython Licence Agreement (BSD-3-Clause file by file); Oracle; 2026-10-10). BsaI and BsmBI assemblies built around a chosen scarless product; Bio.Restriction confirms the released overhangs and that no recognition site survives in the product; reverse complements by Biopython
- Hand-worked Gibson assemblies gibson.py with Biopython 1.88 (MIT (the script); Biopython Licence Agreement (BSD-3-Clause file by file); Oracle; 2026-10-10). exact-overlap assemblies built from a chosen product; the product is re-derived by an independent concatenation and base-accounted; reverse complements by Biopython
- Independent SpCas9 enumeration crispr.py with Biopython 1.88 (MIT (the script); Biopython Licence Agreement (BSD-3-Clause file by file); Oracle; 2026-10-10). every NGG guide found by one regular-expression search for a protospacer and its PAM, run over the sequence for the + strand and over the Biopython reverse complement for the − strand with positions mapped back, one case worked by hand base by base with a write-refusal guard, and GC, homopolymer run and the within-sequence occurrence count computed independently; no score
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 Plasmid'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 name you type is sent to eutils.ncbi.nlm.nih.gov only when you confirm the lookup: never a structure, never a project, never a list of names without a confirmation that shows the list. 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. Your plasmids, your feature edits and the digests you choose, 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 plasmid sequence while it fits (up to about 5,500 bp), the chosen enzymes and the view, never your feature edits); anyone who receives it can read it, and mail and chat tools may fetch the link to show a preview. Names are sent to eutils.ncbi.nlm.nih.gov only after you confirm, and the record shows which names were sent. A file you export or share goes wherever you send it.
Hosts the app contacts
eutils.ncbi.nlm.nih.gov
- Operator
- NCBI, US National Library of Medicine
- What for
- Fetching a public nucleotide record by accession, only when you press Fetch from NCBI.
- What it receives
- The accession you typed or a link armed, and your IP address
- When
- only when you confirm
- one accession: 1 request
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://eutils.ncbi.nlm.nih.gov 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: plasmid maps and sequence assembly designs. A designed product is not evidence that the reaction occurred; nothing here predicts expression or how well a reaction will work.
- 2. Enzyme sites and cut positions are from a hand-curated table of 223 enzymes (version 1, built 2026-10-06); it may differ from a vendor's list, so check NEBcutter before a critical digest. Star activity, Type IIB and nicking enzymes are not modelled.
- 3. Methylation blocking is called only where McClelland et al. (1994) record it; elsewhere a site reads 'may be blocked: sensitivity not recorded', which means unknown, never 'cuts'. 25 of the 82 enzymes whose site can carry a dam or dcm methylated base have no row in this app's copy of Table I, and whether Table I lists them has not been checked.
- 4. Only dam (GATC) and dcm (CCWGG) methylation are modelled; EcoKI, CpG and other host methylation are not, and neither is hemimethylated DNA for DpnI.
- 5. Feature badges are alignment matches to public records: evidence of sequence, not of function.
- 6. No call does not mean the feature is absent: a feature is called only if it is one of the library's 90 features and its alignment passes the thresholds; features under 30 bases are called only when found whole and exact.
- 7. The gel is schematic: band order and spacing by the logarithm of size only, no millimetre or Rf positions; fragments under 100 bp are not drawn; a band holds the fragments within 5 percent of its largest (a judgement), which may not resolve; the forms of uncut DNA are not modelled.
- 8. A ladder lane draws its sheet's sizes as listed; the gel gives no band positions, no sizing by interpolation, no match with a ladder band, no migration at any agarose percentage and no supercoiled or nicked behaviour.
- 9. Primer sites are exact and one-mismatch sites of the shipped primers; whether a primer primes at a mismatched site is not assessed, and a Tm is given only against a perfect match.
- 10. SnapGene .dna files are read-only, and a file with a block this reader does not know is refused; the reader is checked on synthetic files built from NCBI records.
- 11. Opening a public accession sends it, and your IP address, to NCBI; pasted sequences and files do not leave your browser.
- 12. Plasmids up to 50,000 bp. A link carries a plasmid up to about 5,500 bp; a larger plasmid travels as a GenBank file or by Send to on this browser, and your feature edits travel only in a GenBank file.
- 13. Not biosafety advice. Follow your institution's rules for viral vectors and selection markers.
- 14. No offline use: the pages are served by the site, and nothing is installed.
- 15. Assembly is sequence design, not evidence of a reaction. Restriction and Golden Gate refuse overlapping staggered cleavage intervals; restriction selects the longest enzyme-ended fragments and reports compatible orientations. Golden Gate supports BsaI and BsmBI. Gibson takes 2–6 ordered linear fragments with exact terminal homology of at least 15 bp and no repeated homology on either strand. Products are limited to 50,000 bp. No repair, efficiency or experimental-success prediction is made.
Where it runs and what it sends
- Open a plasmidPaste the letters or a record, drop a GenBank or .dna file, open an example, or type an accession and fetch it from NCBI when you choose; nothing is sent until you press Fetch.
- Read the mapFeatures, enzyme sites and primer sites are drawn on a circular or linear map, with the feature table as the same information in text; arrow keys walk the features and Enter opens one in the inspector.
- Pick a digestChoose enzymes or let the picker find a digest that tells the correct construct from an empty or reversed one, then read the fragments and the schematic gel.
- Keep it, share itKeep the plasmid in this browser, edit its features, send it to the sequence or assay app, and share it as a link while it is small or as a GenBank file with your edits.
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 the map
- 1
- Go to the features
- 2
- Go to the digest
- 3
- Go to the sequence
- 4
- Go to the numbers
- 5
- Go to the explainers
- 6
- Go to assembly
- 7
- Reset the map view
- r
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
Which enzymes are in the table?
223 commercially available Type II enzymes in common use for mapping and cloning, typed by hand from published facts, with isoschizomers kept as separate rows where the cut or the methylation sensitivity differs. Type IIB, nicking, homing and Type III enzymes are not in it, and an enzyme the table lacks reads "not in this table", never "no sites". Every row was checked against Biopython's Bio.Restriction on pUC19 and pBR322; check NEBcutter before a critical digest.
What does "may be blocked" mean?
A dam (GATC) or dcm (CCWGG) mark falls on the site, and McClelland et al. (1994, Table I) record nothing that settles whether the enzyme cuts it: no entry, only slow or conflicting entries. The app treats such a site as unknown, never as a cut: it is left out of the cutter lists and the picker, and a digest with one such site shows both outcomes. Set the DNA as a PCR product or synthetic DNA and the marks go away.
How sure is a feature call?
Each call is an alignment to a part cut from an NCBI record, with its identity (identical columns over all columns, gaps included), coverage (the part's aligned bases over its length), mismatches and gaps. This app’s annotation heuristics require 99 percent for a match identity and 95 percent coverage; a partial match 90 and 50 percent with 30 aligned bases; parts under 30 bases are called only when found whole and exact. It is evidence of sequence, not of function, and no call does not mean a part is absent: the library is small, and its gaps are listed.
Is the gel a prediction of where bands will run?
No. The gel is schematic: it orders the bands and spaces them by the logarithm of size, with no millimetre or Rf positions, because no calibrated mobility model is used. Fragments under 100 bp are not drawn; a band holds the fragments within 5 percent of its largest (a judgement), marked as possibly unresolved.
Can I open a SnapGene .dna file?
Yes, read-only: its sequence, features, primers and notes are read by a reader written from the public packet structure, and a file containing a block the reader does not know is refused with the reason. The reader has been checked on synthetic files built from NCBI records; nothing is written back in SnapGene's format. SnapGene is a trademark of GSL Biotech LLC (Dotmatics); this app is not affiliated with or endorsed by it.
Is anything sent to a server?
Fetching from NCBI sends the accession and your IP address after you press Fetch. Optional Bench backups upload the Study you choose. Scientific computation and file import run locally; a plasmid you keep is stored in this browser, and a link carries a small plasmid's sequence after the # of the address, never your feature edits.
Is this biosafety or medical advice?
No. It is research and education software. Follow your institution's rules for viral vectors and selection markers.
Next step
Want this tuned to your vectors?
Email m.beale@icloud.com with what you need, or use the contact page.