Docs and methods
Drybench Calc.
How the calculators turn inputs into masses, volumes, concentrations, pKa values and extinction coefficients, what they let you take away, how each module is checked against a named oracle, and what leaves your browser (nothing).
Updated 17 October 2026 · v0.2.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
One live page, the bench sheet, holds the calculations a bench day needs: the mass to weigh for a molarity, the volume for a mass you actually weighed, a C1V1 dilution with units that convert as you change them, a serial-dilution plan with the volumes per tube and the DMSO carried from the stock, a protein concentration from an A280 reading with the extinction coefficient computed from the sequence, a buffer's pKa at the working temperature, and a multi-component recipe table. Every input has its unit beside it and the answer updates as you type, rounded once at display; the link keeps the inputs, never the results, so a bookmark reopens the same sheet and recomputes it.
Salt forms, hydrates and purity are handled where they bite. A compound that arrives from the molecule app carries the formula of the whole input and of its parent, so an imatinib mesylate stock is weighed on 589.72 g/mol, not the parent's 493.62, and the sheet says what the shortfall would have been. A formula weight typed from the vial label or a certificate of analysis overrides every computed value, and a purity below 100 percent scales the mass. A curated table of 75 common reagents with their hydrate forms, PubChem identifiers and formula weights fills the field with one pick.
How it works
Every calculation runs in your browser from three pure modules the suite shares: units (SI prefixes as exact powers of ten, one base unit per quantity, so chained conversions never accumulate error), dilution (C1V1, stocks with purity and the parent equivalent, serial plans and recipes, and the buffer table from Goldberg, Kishore and Lennen 2002 with the Clarke and Glew temperature equation) and seq (the average molecular weight and the Pace 1995 extinction coefficient of a protein sequence, shared with the protein app so both show the same number). Formula weights are exact sums of the IUPAC CIAAW 2021 standard atomic weights, using the conventional value for the elements given as an interval, and are rounded once when shown.
The scientific methods run locally: the app contacts no host, needs no account for scientific use; optional Bench sign-in uses session cookies. The reagent table is a static file served with the app. A stock, a dilution plan, a buffer or a recipe you pin, send or add to a study is kept in this browser as a recipe object, with its inputs and the method versions it was made with, so it recomputes when reopened.
How it is checked
Each module is compared with a named external oracle on a published fixture set, never with its own output: 28 dilution and molarity cases worked exactly in rational arithmetic, including unit chains and the pipetting-flag edges; 58 formula weights of salts, hydrates and their parents with the formula from RDKit 2026.03.6 and the weight as a CIAAW 2021 sum in a separate decimal implementation, with PubChem's identifiers recorded; 15 buffers at 4, 25 and 37 °C against Goldberg's equation in NumPy; and 22 protein sequences from UniProt against Biopython's ProtParam for ε280, which agrees with the ExPASy ProtParam outputs recorded for nine of them. The fixture files, their hashes and the script that wrote them are published on the verification page.
Equations and defaults
- Units
- SI prefixes as exact powers of ten with one base unit per quantity (mol/L, L, g, g/mol); the micro sign and the Greek mu are read as one character; a value is converted once and rounded once when shown, half away from zero.
- Molarity and stocks
- n = C·V and m = n·M / purity; the volume for a weighed mass is V = m·purity / (C·M); the parent-equivalent mass of a salt or hydrate is m·MW(parent) / FW(form).
- C1V1
- C1·V1 = C2·V2 with the diluent V2 − V1; a stock weaker than the final concentration is refused rather than solved.
- Sample normalisation for gel loading
- The Dilution calculator's second view (method sample-normalisation 1.0.0). For a load volume V per well and a loading-dye stock factor k (0 for no dye, otherwise above 1), the dye is D = V/k and A = V − D is left for sample and diluent; the sample volume is s = m/c for a target mass m, or C·V/c for a target concentration C, with each sample's concentration c in mg/mL as entered. A sample with s > A is withheld with no volumes, and the largest amount it can deliver (c·A µg, or c·A/V mg/mL) is shown; otherwise the diluent is A − s and the planned mass s·c on unrounded volumes. A positive transfer below 2 µL is flagged, never refused. A concentration that is not a positive number makes its row invalid; a load or target that is not above zero, or a dye factor that is neither 0 nor above 1, refuses the batch. The view opens empty unless concentrations arrive from a standard curve in Assay; its worked example of five illustrative lysates loads only when chosen, carries a banner until cleared, and never reaches a worklist. It does not check the assay, the protein or the well's capacity, and volumes are taken as additive.
- Serial dilution
- Each tube holds R·W·f/(f − 1) before it passes V/f to the next, the last tube is made the same way and keeps V/f over after its wells (2.0.0; 1.0.0 made it to R·W), and the top tube takes V·C(top)/C(stock) from the stock; the solvent fraction at a point is the stock's fraction scaled by C(point)/C(stock).
- Plate preparation sheet
- An optional section of the serial dilution (method plate-sheet 1.0.0) that plans the plate the series fills. Each tube keeps batch(R, W, p, D) = R·W·(1 + p/100) + D for R replicate wells of W with overage p and dead volume D (overage on the bulk, per well, or both); a tube is made to keep·f/(f − 1) and passes tube/f to the next, as the constant-transfer serial dilution does; the top tube is drawn from the stock, or from an optional intermediate at or above the top point's concentration and below the stock's. The vehicle is diluent at the top point's carrier fraction, made from neat carrier for its own wells. Dead volume is charged once per prepared source, never per well. Dose positions come from the same placement Assay reads, so the two apps cannot disagree; vehicle, blank and positive-control lines are typed well ranges, and a positive control is listed with no concentration because you supply it. A plan that cannot be made gives no sheet and names why: an overage outside 0 to 1,000 percent, a negative dead volume, a series that does not plan, a stock weaker than the top point, an intermediate outside that range, a well range or start well that does not read or lies off the plate, wells that overlap or do not fit, a transfer below the minimum, a carrier above the maximum, or not enough stock. Everything on it is planned, not measured; volumes are taken as additive, and repeated wells share a stock and are not independent replicates. Print plate plan shows the same plan on paper with its map and every row, and adds no arithmetic.
- Master mix
- B = N × M × (1 + extra% / 100) + dead volume. Each shared component scales by B / M; separate additions scale by N. Final concentration refers to the completed reaction, including separate additions. One common liquid formulation and one mix vessel; volumes are treated as additive. The planner does not assess reagent compatibility, enzyme activity or reaction conditions. Separate samples must use the same entered volume; make another plan for a different formulation. Overage and dead volume default to zero; a minimum transfer is optional and applies to actual handling volumes. Method version 1.0.0; primary references read 9 October 2026: Thermo Fisher MAN0025706 B pp. 12–13, INTEGRA dead-volume guidance and Eppendorf small-volume pipetting guidance.
- Bench flags
- A pipetting step below 2 µL and a solvent fraction above 0.5 percent are flagged; both are bench conventions adopted on 6 October 2026, not instrument specifications.
- Liquid-handler worklists
- The plate sheet and sample normalisation write Tecan worklists: A;RackLabel;;;Position;;Volume records, then D; and W;, with positions numbered rear to front, then left to right (A1 = 1, B1 = 2, A2 = 9 on 96 wells), volumes in µL at two decimals with a warning when rounding moves one by more than 0.1 percent, and comment lines that say the file is a plan. The plate sheet's file covers only the dispense, from a tube rack, Tubes, to the Plate in the Dispense table's order; the tubes are prepared by hand. Normalisation's file draws diluent, then dye, then sample for each row, from Diluent, Dye and Samples to a 96-well Prep plate, and leaves out a zero volume. It is refused for a batch with a withheld or invalid row, for the worked example, or for more than 96 samples. A refused file is never offered for download. Neither offers an Echo pick list: both draw from tubes, and an Echo draws only from source-plate wells.
- Bench checklist
- Opened from C1V1, serial dilution, master mix, sample normalisation and the printable protocol. It lists the plan's own steps and volumes, with no added procedure, beside large tick boxes, and carries the plan's own flags (the 2 µL convention, the master mix's minimum transfer). Ticks are kept while it is open and cleared when it closes: a tick is a reminder on the screen, not a record that a step was done. The optional timer counts down from a stored end time.
- Formula weights
- Exact sums of the IUPAC CIAAW 2021 standard atomic weights held as integers in units of 10⁻⁴ g/mol, conventional values for the interval elements, hydrates as the anhydrous formula plus n × 18.015; imatinib 493.615 and its mesylate 589.715, shown as 493.62 and 589.72.
- pKa at temperature
- Goldberg, Kishore and Lennen 2002, equation 12: pK(T) = pK(Tr) − (ΔrH°/(R ln 10))(1/Tr − 1/T) − (ΔrCp°/(R ln 10))(Tr/T − 1 + ln(T/Tr)), with R = 8.31451 J/(K mol) and Tr = 298.15 K, from the paper's recommended values at zero ionic strength; the linear slope −ΔrH°/(R ln 10 Tr²) is shown as the approximation it is.
- ε280 and A280
- Pace et al. 1995: 5,500 per Trp, 1,490 per Tyr and 125 per cystine, in both cysteine conventions; c = A/(ε·l) and mg/mL = c·MW, with the average molecular weight from the ExPASy ProtParam residue masses the protein app uses.
- A260
- 50, 40 and 33 µg/mL per absorbance unit for double-stranded DNA, RNA and single-stranded DNA, labelled as rules of thumb; no nearest-neighbour ε260 in this version.
- Reagent table
- 75 reagents hand-typed with their formulas and hydrate waters, each row's PubChem CID, InChIKey and formula read on 6 October 2026 and checked against the formula; pKa values are the Goldberg entries each buffer names, typed once.
Data sources, licences and versions
Sources and licences
IUPAC CIAAW standard atomic weights 2021
IUPAC CIAAW standard atomic weights 2021Values cited from the published tableFormula weights: the conventional value for each interval element (H, C, N, O, S and Cl among them) and the abridged value for the rest, 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.
Goldberg, Kishore and Lennen 2002, buffer ionisation thermodynamics
Goldberg, Kishore and Lennen 2002, buffer ionisation thermodynamicsValues cited from the published tablepK, ΔrH° and ΔrCp° at 298.15 K and zero ionic strength for 34 buffer reactions, and the paper's equation 12 for pK at another temperature.
Goldberg RN, Kishore N, Lennen RM. Thermodynamic quantities for the ionization reactions of buffers. J Phys Chem Ref Data 2002;31:231-370. Section 8 read 6 October 2026.
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.
A260 conversion conventions (Thermo Fisher; Cavaluzzi and Borer 2004)
A260 conversion conventions (Thermo Fisher; Cavaluzzi and Borer 2004)Values cited from the published pagesThe A260 rules of thumb, in µg/mL per absorbance unit at 1 cm: 50 for dsDNA and 40 for RNA as Thermo Fisher prints them, and 33 for ssDNA, the convention NanoDrop instruments apply. Cavaluzzi and Borer measured 38 for non-repetitive ssDNA. These are conventions, not measurements, and not for oligonucleotides, which need a sequence-specific ε260.
Thermo Fisher NanoDrop One FAQ; Thermo Fisher technical note MCS-TN1315-EN 2/25, Accurate Oligonucleotide Quantification with NanoDrop Spectrophotometers; Thermo Fisher, DNA and RNA Molecular Weights and Conversions; IDT, ‘Oligo quantification: Getting it right’ (modified 22 August 2025); Cavaluzzi MJ, Borer PN. Revised UV extinction coefficients for nucleoside-5′-monophosphates and unpaired DNA and RNA. Nucleic Acids Res 2004;32(1):e13, doi:10.1093/nar/gnh015 (Method 1: 33 µg per A260 unit). Read 17 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 both 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.
PubChem (NCBI)
PubChem (NCBI)No NCBI restrictions; depositor terms may applyThe compound identifiers (CID and standard InChIKey) and formulas of the 75 reagents in the shipped table, read once when the table was curated and checked against the hand-typed formulas; nothing is fetched while you work.
Kim S, Chen J, Cheng T, et al. PubChem 2025 update. Nucleic Acids Res 2025;53:D1516-D1525. Records read 6 October 2026.
uqr 0.1.3
uqr 0.1.3MITThe QR code on a stock label, drawn in your browser as inline SVG; it loads only with the label dialog.
Copyright (c) 2023 Anthony Fu.
NIH Global Substance Registration System
NIH Global Substance Registration SystemCited public substance identity factsThe complete chemical definition explicitly linked to retatrutide's UNII record, including modified residues and stereochemistry. Shipped locally; the source identifiers and retrieval date accompany the structure.
NCATS / FDA Global Substance Registration System, UNII NOP2Y096GV, alternate chemical definition 210e2d2c-6b8e-4b0d-b432-20057541f324, version 1, retrieved 8 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 bench sheet as CSV (every input and answer, units in the headers, the method and constants table per row, with the provenance sidecar), the serial-dilution plan as TSV with units in the column headers (the table the assay analyser reads), the recipe as JSON (inputs, components, method versions and constants tables, never results), the bench sheet as a printed page with the method block, a stock label with a QR code of the calculation's link, the plate preparation sheet as CSV and as a printed plate plan with its map, and Tecan worklists for the plate sheet and for sample normalisation, whose plan also copies as a tab-separated or Markdown table. A worklist is a plan for the robot to follow, written only when every row is planned. Copy link puts your inputs 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/units/units.test.ts and formula-mass-fixtures.test.ts
- Unit conversions and spellings; every formula weight in fixtures/formula-mass.json against the CIAAW sum, exactly, with RDKit's own weight recorded beside each organic.
- src/lib/dilution/dilution.test.ts and fixtures.test.ts
- C1V1, stocks, the parent equivalent, serial plans with their flags and recipes against fixtures/dilution.json to nine significant figures, and pK at three temperatures against fixtures/buffers.json within 0.01 and 0.0001.
- src/lib/dilution/normalization.test.ts
- Sample normalisation against pipeline/lab-calculators/fixtures/normalization-v1.json (12 cases, written in Python fractions by pipeline/lab-calculators/normalization/reference.py from the method, never from the engine): volumes, masses and limits at relative 1e−12; statuses, flags and refusals exactly.
- src/lib/dilution/plate-sheet-oracle.test.ts
- The plate preparation sheet against src/lib/dilution/fixtures/plate-sheet-2.json, written in Python fractions by pipeline/lab-calculators/plate_sheet_reference_2.py: values at relative 1e−9; wells, roles, sources and refusals exactly. The oracle places dose wells by its own reading of the placement rule and checks one 96-well and one 384-well layout against wells written out by hand; the engine's wells, from the shared placement, must match exactly.
- src/lib/export/liquid-handlers/liquid-handlers.test.ts
- The Tecan writer against the record layout, the position numbering and five example lines in liquid-handler-formats-v1.json, transcribed on 17 October 2026 from TeselaGen's Tecan worklist page and robotools' example worklists. The Echo writer against the column header, the nL unit and the droplet sizes recorded there from TeselaGen's Echo worklist page and two Beckman Coulter product sources. Both refusals return no file text.
- src/components/tools/lab-calculators/plate-sheet-worklist.test.ts and normalization-worklist.test.ts
- The plate sheet's worklist on its oracle's first planned case: every dispense row becomes one aspirate, dispense and wash triple at its numeric positions in µL. The normalisation worklist on every planned case of its oracle: each sample keeps its own source and destination position, a batch with a withheld or invalid row writes no file, and a 97th sample refuses the file.
- src/lib/dilution/master-mix.test.ts and src/apps/lab-calculators/master-mix-workspace.test.ts
- Independently hand-worked preparation quantities, volume/composition conservation, explicit shared and separate allowances, mixed units, impossible input refusal, exact complete/incomplete recipe resume and immutable result retention. This is arithmetic verification; it does not validate a laboratory protocol or pipette.
- src/lib/seq/protein-mass.test.ts and extinction-fixtures.test.ts
- ε280 and the molecular weight against the recorded ExPASy ProtParam outputs and Biopython's ProtParam on fixtures/extinction.json, exactly; a guard that the constants live in src/lib alone.
- src/lib/fixture-hashes.test.ts and pipeline/lab-calculators/verify-reagents.test.ts
- Every fixture file matches the SHA-256 the oracle script recorded and its published copy; every reagent's weight recomputes from its formula and agrees with PubChem's at the precision PubChem prints.
- pipeline/lab-calculators/reference.py
- The oracle script (Python 3.11 with the pinned requirements.txt): rational and decimal arithmetic, RDKit 2026.03.6, NumPy 2.4.6 and Biopython 1.85; it writes the fixtures and their hashes and copies them under public/verification.
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 |
|---|---|---|---|---|---|
| formula-mass, stock-salt-purity | RDKit | 58 | exact (decimal sums of the same CIAAW 2021 table) | 2026-10-06 | formula-mass.jsonRecorded for version 0.1.0; the test suite checks the current engine against it. |
| stock-salt-purity, c1v1, recipe-table, pipette-minimum-2ul, dmso-carry-over | Python fractions and decimal | 31 | nine significant figures; display values exact | 2026-10-06 | dilution.jsonRecorded for version 0.1.0; the test suite checks the current engine against it. |
| pka-temperature-goldberg | NumPy | 15 | within 0.01 (and within 0.0001) at 4, 25 and 37 °C | 2026-10-06 | buffers.jsonRecorded for version 0.1.0; the test suite checks the current engine against it. |
| extinction-280-pace, a280-beer-lambert | Biopython | 22 | exact | 2026-10-06 | extinction.jsonRecorded for version 0.1.0; the test suite checks the current engine against it. |
| master-mix-preparation | Python fractions and decimal | 14 | nine significant figures; refusals exact | 2026-10-10 | master-mix.json |
| serial-dilution, pipette-minimum-2ul, dmso-carry-over | Python fractions and decimal | 10 | relative 1e-9; each step exactly the fold; flags exact | 2026-10-10 | serial-2.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| plate-sheet, serial-dilution | Python fractions and decimal | 22 | relative 1e-9; wells, roles and refusals exact; compound, carrier and volume balance asserted | 2026-10-10 | plate-sheet-2.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| antibody-dilution | Python fractions and decimal | 10 | relative 1e-9; refusals exact | 2026-10-10 | antibody-batch.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| od600-cell-estimate | Python fractions and decimal | 14 | relative 1e-9; refusals exact | 2026-10-10 | od600.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| buffer-recipe, pka-temperature-goldberg | NumPy | 18 | mass relative 1e-9; setpoint within 0.01 pH, equal to 2 decimals; refusals exact | 2026-10-10 | buffer-recipe.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| unit-conversion, temperature-offset | Python fractions and decimal | 44 | prefix changes and temperature exact as decimal strings; molar bridges relative 1e-9; refusals exact | 2026-10-10 | unit-converter.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| cell-seeding, centrifuge-rcf-rpm, percent-solution, antibody-dilution | Python fractions and decimal | 41 | relative 1e-9; refusals, flags and text rows exact | 2026-10-10 | preparation-3.jsonRecorded for version 0.3.0; the test suite checks the current engine against it. |
| a280-beer-lambert | Python fractions and decimal | 14 | relative 1e-9; refusals exact | 2026-10-17 | absorbance-a280.jsonRecorded for version 0.6.0; the test suite checks the current engine against it. |
| a260-a280-ratio | Python fractions and decimal | 10 | relative 1e-9; refusals exact | 2026-10-17 | absorbance-ratio.jsonRecorded for version 0.6.0; the test suite checks the current engine against it. |
| a260-rules-of-thumb | Python fractions and decimal | 19 | relative 1e-9; refusals exact | 2026-10-17 | a260-2.jsonRecorded for version 0.5.0; the test suite checks the current engine against it. |
| cell-counting-volume | Python fractions and decimal | 28 | relative 1e-9; refusals and receipt integrity exact | 2026-10-18 | cell-counting-v3.jsonRecorded for version 0.7.0; the test suite checks the current engine against it. |
| dose-per-cell-arithmetic | Python fractions and decimal | 35 | relative 1e-9; refusals and receipt integrity exact | 2026-10-18 | dose-plan-v3.jsonRecorded for version 0.7.0; the test suite checks the current engine against it. |
| cell-counting-volume, dose-per-cell-arithmetic | Python fractions and decimal | 49 | each receipt reads or reads as null, exactly; density identities within float rounding | 2026-10-20 | receipt-integrity-v1.jsonRecorded for version 0.9.0; the test suite checks the current engine against it. |
| one-intermediate-dilution | Python fractions and decimal | 13 | feasibility exact; plan within one grid step | 2026-10-10 | intermediate-dilution.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.
- Python fractions and decimal 3.11.15 (Python-2.0; Oracle; 2026-10-06). exact rational and decimal arithmetic for the dilution, molarity, formula-weight and preparation fixtures
- Python fractions and decimal 3.13.16 (Python-2.0; Oracle; 2026-10-10). exact rational arithmetic for the everyday-preparation fixtures (cell seeding, RCF and RPM, percent solutions, antibody dilution)
- RDKit 2026.03.6 (BSD-3-Clause; Oracle; 2026-10-06). the molecular formula of each organic compound from PubChem's SMILES, and its own weight for comparison
- NumPy 2.4.6 (BSD-3-Clause; Oracle; 2026-10-06). Goldberg's equation 12 for pK at 4, 25 and 37 °C
- NumPy 2.5.3 (BSD-3-Clause; Oracle; 2026-10-10). Goldberg's equation 12 for the buffer-recipe setpoints
- Biopython 1.85 (Biopython License Agreement (BSD-3-Clause file by file); Oracle; 2026-10-06). ε280 by ProtParam for the extinction fixtures
Every row is one fixture compared with the engine when this page was built; the full sets are the published files, and pipeline/lab-calculators/reference.py wrote them.
Formula weights of salts, hydrates and parents
Expected values from CIAAW 2021 sum in Python decimal, formula from RDKit (Python 3.11.15; RDKit 2026.03.6), recorded 2026-10-06; tolerance exact; 12 of 58 shown, all passing. formula-mass.json sha256 b8319e3e0ef032e2…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| imatinib (C29H31N7O) | 493.615 | 493.615 | 0 | yes |
| imatinib mesylate (C30H35N7O4S) | 589.715 | 589.715 | 0 | yes |
| metformin (C4H11N5) | 129.167 | 129.167 | 0 | yes |
| metformin hydrochloride (C4H12ClN5) | 165.625 | 165.625 | 0 | yes |
| dabrafenib (C23H20F3N5O2S2) | 519.560 | 519.56 | 0 | yes |
| dabrafenib mesylate (C24H24F3N5O5S3) | 615.660 | 615.66 | 0 | yes |
| erlotinib hydrochloride (C22H24ClN3O4) | 429.901 | 429.901 | 0 | yes |
| erlotinib (C22H23N3O4) | 393.443 | 393.443 | 0 | yes |
| sorafenib tosylate (C28H24ClF3N4O6S) | 637.026 | 637.026 | 0 | yes |
| sorafenib (C21H16ClF3N4O3) | 464.828 | 464.828 | 0 | yes |
| doxorubicin hydrochloride (C27H30ClNO11) | 579.983 | 579.983 | 0 | yes |
| doxorubicin (C27H29NO11) | 543.525 | 543.525 | 0 | yes |
Molarity, dilutions and the salt-form correction
Expected values from Python fractions and decimal (3.11.15), recorded 2026-10-06; tolerance nine significant figures; 12 of 15 shown, all passing. dilution.json sha256 c569983c9d1a2706…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| mass-nacl-150mm | 8.766 g | 8.766 g | 0 | yes |
| mass-imatinib-mesylate-10mm | 0.00589715 g | 0.00589715 g | 8.673617380e-19 | yes |
| mass-erlotinib-hydrochloride-5mm | 0.00429901 g | 0.00429901 g | 8.673617380e-19 | yes |
| mass-tris-1m | 60.5675 g | 60.5675 g | 0 | yes |
| mass-hepes-20mm | 1.191505 g | 1.191505 g | 0 | yes |
| mass-glucose-5um | 0.0000090078 g | 0.0000090078 g | 0 | yes |
| mass-edta-500mm | 18.6118 g | 18.6118 g | 0 | yes |
| volume-for-mass-imatinib-mesylate | 0.001928049990249527314041528534970282254988 L | 0.00192804999 L | -4.336808690e-19 | yes |
| volume-for-mass-staurosporine | 0.002143434339104173052314801914515551687847 L | 0.002143434339 L | 0 | yes |
| volume-for-mass-small | 0.01428571428571428571428571428571428571429 L | 0.01428571429 L | 0 | yes |
| c1v1-10mm-to-50um | 0.000001 L | 0.000001 L | 0 | yes |
| c1v1-1m-to-150mm | 0.0075 L | 0.0075 L | 0 | yes |
pK at 4, 25 and 37 °C
Expected values from Goldberg 2002 equation 12 in NumPy (NumPy 2.4.6; Python 3.11.15), recorded 2026-10-06; tolerance within 0.01; 12 of 45 shown, all passing. buffers.json sha256 18881ec180af861e…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| Tris at 4 °C | 8.7103 | 8.7103 | -0.00000 | yes |
| Tris at 25 °C | 8.0720 | 8.0720 | 0.00000 | yes |
| Tris at 37 °C | 7.7527 | 7.7527 | 0.00004 | yes |
| HEPES at 4 °C | 7.8281 | 7.8281 | -0.00001 | yes |
| HEPES at 25 °C | 7.5640 | 7.5640 | 0.00000 | yes |
| HEPES at 37 °C | 7.4238 | 7.4238 | 0.00004 | yes |
| MOPS at 4 °C | 7.4605 | 7.4605 | 0.00002 | yes |
| MOPS at 25 °C | 7.1840 | 7.1840 | 0.00000 | yes |
| MOPS at 37 °C | 7.0400 | 7.0400 | -0.00003 | yes |
| MES at 4 °C | 6.4657 | 6.4657 | 0.00005 | yes |
| MES at 25 °C | 6.2700 | 6.2700 | 0.00000 | yes |
| MES at 37 °C | 6.1695 | 6.1695 | -0.00002 | yes |
ε280 (cystines / reduced)
Expected values from Biopython Bio.SeqUtils.ProtParam (Biopython 1.85; Python 3.11.15), recorded 2026-10-06; tolerance exact; 12 of 22 shown, all passing. extinction.json sha256 94e04f78b54b8d3a…
| Input | Expected | Ours | Difference | Pass |
|---|---|---|---|---|
| Insulin (110 aa) | 17335 / 16960 | 17335 / 16960 | 0 | yes |
| Hemoglobin subunit beta (147 aa) | 15595 / 15470 | 15595 / 15470 | 0 | yes |
| Transthyretin (147 aa) | 18575 / 18450 | 18575 / 18450 | 0 | yes |
| GTPase KRas (189 aa) | 13660 / 13410 | 13660 / 13410 | 0 | yes |
| Cellular tumor antigen p53 (393 aa) | 36035 / 35410 | 36035 / 35410 | 0 | yes |
| Epidermal growth factor receptor (1210 aa) | 128890 / 125140 | 128890 / 125140 | 0 | yes |
| Spike glycoprotein (1273 aa) | 148960 / 146460 | 148960 / 146460 | 0 | yes |
| Hemoglobin subunit alpha (142 aa) | 9970 / 9970 | 9970 / 9970 | 0 | yes |
| Tubulin beta chain (444 aa) | 46340 / 45840 | 46340 / 45840 | 0 | yes |
| Lysozyme C (147 aa) | 37970 / 37470 | 37970 / 37470 | 0 | yes |
| Albumin (607 aa) | 49915 / 47790 | 49915 / 47790 | 0 | yes |
| Green fluorescent protein (238 aa) | 22015 / 21890 | 22015 / 21890 | 0 | 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 Calc'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 compound names you type into search 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 reagent, masses, volumes, sequence and dilution steps 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
pubchem.ncbi.nlm.nih.gov
- Operator
- NCBI, U.S. National Library of Medicine
- What for
- Retrieves the selected compound's complete formula and structure through this site.
- What it receives
- the compound name searched or selected
- 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://pubchem.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: the stock, dilution and buffer calculations here are not for dosing or clinical preparation.
- 2. Formula weights use the IUPAC 2021 conventional atomic weights, so a vendor label may differ in the third decimal; a weight typed from the vial or a certificate of analysis overrides every computed value.
- 3. pKa values are thermodynamic values at zero ionic strength from Goldberg et al. 2002; ionic strength and buffer concentration shift the working pKa and are not applied here, so a buffer's final pH is for a meter to confirm.
- 4. ε280 is the Pace et al. 1995 estimate for a folded protein in water; the measured value can differ by several percent, and a tag changes it, so the sheet computes the tagged construct when you give it.
- 5. The A260 conversions (50 µg/mL per unit for double-stranded DNA, 40 for RNA, 33 for single-stranded DNA) are rules of thumb; an oligonucleotide's ε260 by nearest neighbour is not computed here.
- 6. The 2 µL pipetting flag and the 0.5 percent DMSO flag are bench rules of thumb, not instrument specifications.
- 7. The reagent table holds 75 common reagents as single compounds; mixtures such as kanamycin lots, polymers such as Triton X-100 and proteins such as albumin have no single formula weight and are not in it.
- 8. No offline use: the pages are served by the site, and nothing is installed.
- 9. 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.
- 10. A compound record that arrives from another app carries that app's formula weight as reported; the weight shown here is recomputed from its formula with the CIAAW 2021 table, and the two can differ in the second decimal.
- 11. The serial-dilution planner assumes each tube is made in one step from the tube before it and that the diluent carries no solvent of its own. Every tube, the last included, is made to the same volume with the same transfer, so the last keeps one transfer's volume over. Serial dilution 1.0.0: last point under-diluted by f/(f − 1); any plan printed from 1.0.0 is affected.
- 12. The plate preparation sheet gives planned volumes and concentrations, not measured ones; volumes are treated as additive, dead volume is charged once per source and the overage in bulk unless you choose otherwise. Repeated wells share a stock; they are not independent replicates.
- 13. RCF and RPM convert with the published rounded coefficient 1.118 × 10⁻⁵ and the radius you supply; no centrifugation time, rotor model or rotor limit is supplied or certified.
- 14. Percent solutions need an explicit basis (w/v, w/w or laboratory v/v); no density is assumed, so no basis converts to another or to molarity.
- 15. Cell seeding uses the density, viability and targets you supply; it recommends no density, predicts no growth or confluence, and a 1:n split predicts nothing.
- 16. Antibody dilutions use the stock and target, or the 1:n ratio, that you or your datasheet supply; no dilution is recommended and specificity is not predicted.
- 17. Buffer setpoints correct the pK for temperature only (Goldberg et al. 2002, zero ionic strength), for the 15 buffers transcribed twice, between 274 and 350 K; ionic strength, other solutes and titrant amounts are not modelled.
- 18. OD600 estimates use only the factor you supply with its basis, source and calibrated range; readings outside that range are refused, and an estimate is never a count or a viable count.
- 19. The unit converter scales within one quantity and converts molar to mass units only through the formula weight you supply for the exact form; it offers no conversion that needs a density, and reads Da as g/mol.
Where it runs and what it sends
- Type two numbersPick a calculator or open a task page, enter what you know with its unit, and the answer appears as you type, rounded once at display and announced once when it settles.
- Bring the compound or the proteinSend a molecule from the molecule app or a target from the protein app, or pick a reagent from the table: the formula weight or the sequence arrives with it, and a weight from the vial label overrides it.
- Keep it, label it, share itThe link keeps your inputs after the # of the address; a stock, plan or recipe you pin, send or add to a study becomes an object in this browser, and a label prints with a QR code of the link.
- Local calculations, broad compound lookupCalculations, the built-in reagent table and QR codes run in your browser. Searching beyond the table sends compound names through this site to PubChem; no account is needed for calculation.
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 molarity and stocks
- 1
- Go to the C1V1 dilution
- 2
- Go to the serial-dilution planner
- 3
- Go to A280 and A260
- 4
- Go to buffer pKa at temperature
- 5
- Go to the recipe table
- 6
- Go to the master mix
- 7
- Go to everyday preparation
- 8
- Open the stock label
- l
- Pick a reagent
- 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
Why does the formula weight differ from the one on my vial?
The app sums the IUPAC CIAAW 2021 standard atomic weights, using the conventional value for elements given as an interval, so it can differ from a vendor's table in the third decimal. The weight on your vial or certificate of analysis is the one for your lot: type it into the formula-weight field and it overrides the computed value everywhere, with the chip saying so.
What does the salt-form correction do?
A compound sent from the molecule app arrives with the formula of the whole input and of its parent. Imatinib mesylate is 589.72 g/mol while imatinib is 493.62, so weighing the parent's mass for a mesylate stock falls short by about 16 percent. The sheet weighs on the form in the vial and shows the parent-equivalent mass and the shortfall.
How is the pKa at 4 °C worked out?
From the pK, enthalpy and heat capacity of ionisation that Goldberg, Kishore and Lennen published for each buffer in 2002, through their equation 12. For Tris that gives about 8.71 at 4 °C against 8.07 at 25 °C, so a buffer set to pH 8.0 at the bench reads about 8.6 on ice. The values are at zero ionic strength; your meter has the last word.
Where does the extinction coefficient come from?
From the sequence, by the Pace et al. 1995 method: 5,500 per tryptophan, 1,490 per tyrosine and 125 per cystine, shown both with all cysteines paired and all reduced. The protein app computes the same number from the same shared module. If your construct carries a tag, paste the tagged sequence or send the construct, and the sheet uses it.
Is anything sent to a server?
Compound-name suggestions use the bundled catalogues. A public compound lookup can send the selected name through this site to PubChem for its complete formula and structure. Calculation inputs stay after the # of the address, which the browser never sends, and saved stocks, plans and recipes are stored in this browser. Anyone with a shared link can read its inputs.
How are the numbers checked?
Each module is compared with an external oracle on a published fixture set: exact rational arithmetic for dilutions, RDKit formulas with a separate CIAAW sum for formula weights, NumPy for Goldberg's equation and Biopython's ProtParam for ε280. The fixture files, their hashes and the script that wrote them are on the verification page, and the badge on each method names the oracle, the count, the tolerance and the date.
Can I use it for dosing or clinical preparations?
No. It is research and education software and not medical advice; its stock and dilution arithmetic is for the bench, and nothing here has been validated for clinical or regulated use.
Next step
Want this tuned to your bench?
Email m.beale@icloud.com with what you need, or use the contact page.